c#中的接口與泛型

接口

  • 接口:接口是一組包含了類或結構可以實現的功能的定義
  • 接口可以包含事件,索引器,方法和屬性,但是不能包含字段
//接口名一般以大寫字母 I作爲開頭
interface IUSB
{
    string USB_Type { get; set; }
    string ReadFile();
    void WriteFile(string content);
} 
  • 接⼝相⽐類,最⼤的不同之處在於,只有定義沒有實現
  • 接口是一個引用類型,只包含了功能的定義,不包含功能的實現
  • 接口成員的訪問級別是默認的(默認爲public),不可以使用其他修飾詞修飾
  • 類的繼承只能單繼承,接口的實現支持多實現,實現多接口時,用逗號隔開
class Computer : IUSB, IVGA
  • 接⼝不能進⾏實例化,只能被類或結構體或其他接⼝實現
  • 如即繼承類,⼜實現接⼝時,類要放在最前⾯,接⼝放在後⾯,中間都用逗號隔開
//Cube是父類,IArea和IVolumn爲接口
class Square : Cube, IArea, IVolumn
  • 接口一旦被實現,就必須實現接口當中的所有成員
  • 接口與抽象類的相同點:兩者都不能被實例化,兩者都包含了由其他類或結構繼承或實現的抽象成員
  • 接口與抽象類的不同點:抽象類當中除了擁有抽象成員外還可以擁有非抽象成員,而接口中所有的所有成員都是抽象的;抽象成員可以使用修飾符修飾,接口當中接口成員訪問級別是默認不可修改的,並且默認是public;接口當中不可以包含構造方法,析構方法,靜態成員以及常量

泛型

一、泛型方法

  • 有些時候重載的⽅法只有參數類型不同,其他的都⼀樣,這時就可以使⽤泛型
  • C#中的泛型能夠將類型作爲參數來傳遞,即在創建類型時用一個特定的符號如“T”來作爲一個佔位符,代替實際的類型,等待在實例化時再用一個實際的類型來代替
  • 平時⽅法⾥傳遞的是參數,是變量,參數傳遞⽤的是⼩括號(),⽽泛型傳遞的是數據類型,泛型傳遞⽤的尖括號<>
public static void Swap<T>(ref T value0, ref T value1)
{
    T temp = value0;
    value0 = value1;
    value1 = temp;
} 
//使用泛型可以的重用代碼,保護類型的安全以及提高性能
//降低強制轉換或裝箱操作的成本和風險
//可以對泛型參數進行限定以訪問特定數據類型的方法
  • 泛型可以用於⽅法的定義參數、在⽅法體內使⽤泛型定義局部變量、設置返回值類型是⼀個泛型
  • 泛型類型參數可以有多個,泛型類型參數可以是編譯器識別的任何數據類型
  • 泛型參數約束:爲了防止傳入的類型導致方法運行出錯,可以對泛型進行一定的約束,約束語句:
約束語句 意義
where T : struct 表示泛型T是值類型(小數,整數,char,bool,struct)
where T : class 表示泛型T是引用類型
where T : new() 表示這個泛型具有一個無參數的構造方法,如果有多個約束,new()必須放在最後
where T : 基類名 表示這個泛型是該基類或者其派生類
where T : 接口名 表示泛型是實現了該接口的類型
where T:U 指定類型U必須派生於類型T
- 參數約束語句格式:⽅法名(參數列表) where 泛型 :約束內容1,約束內容2 where 泛型B :約束內容3
void Test<T,U>(T p1,U p2) where U : struct where T : Computer, new()
{ 
	//方法體
} 
  • 泛型方法的調用
public static string CombineToString<T>(T value1, T value2)
{
    return value1.ToString() + value2.ToString();
} 
public static void Main(string[] args)
{
    Console.WriteLine(CombineToString<int>(234, 56));
    //調用方法時,有些時候泛型類型可以省略
    Console.WriteLine(CombineToString (234, 56));
} 
  • 泛型方法的泛型重載:如果泛型的個數不同,可以重載;如果泛型的個數相同,但約束不同,不可以重載
void DoWork() {}
void DoWork<T>() {}
void DoWork<T, U>() {} 

二、泛型類和泛型接口

  • 泛型類:class 類名<T,U>{},類中的字段類型、⽅法參數、⽅法返回值,都可以使⽤類中的泛型
class Player<A,B,C>
{
	private A playerName;
	B playerAge;
	C playerSex;
	A GetPlayerName()
	{
		return playerName;
	}
}
  • 類的泛型重載
class Person
{
} 
class Person<T,U>
{
    T name;
    U age;
} 
  • 泛型接口:interface 接⼝名 <T,U>{},接⼝中的屬性類型、⽅法參數、⽅法返回值,都可以使⽤接⼝中的泛型
interface IUSB<T,M>
{
	T usbType { get; set; }
	T ReadFile(T content);
	M WriteFile(M content);
}
  • 關於實現接⼝、繼承類的泛型
//實現接⼝後⾯可以不輸⼊具體類型,⽤類的泛型傳遞
class Computer<T> : IUSB<T, float>
//繼承的類後⾯可以不輸⼊具體類型,⽤類的泛型傳遞
class MiniComputer<T> : Computer<T>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章