接口(Interface):
C#中接口定義的規則:
1、接口本身的默認訪問級別爲internal,即程序集本身訪問級別
2、接口中方法不能使用任何訪問修飾符(例如 public private internal protected)等修飾。(系統自動爲其設置爲public)
3、不能使用virtual修飾
4、接口不能包含字段,無論是常量,還是實例字段,還是static字段,都不能包含。(字段本質上是類實現的一個方面,而接口不能包含任何實現細節)
5、接口不能包含構造函數(構造函數也被認爲是一種類的實現細節,與接口不包含任何實現衝突)
6、接口不能包含析構函數
7、接口中不能嵌套任何類型,無論是接口、類,還是結構、枚舉等類型。
interface IComparable
{
/*
* 接口不能包含字段,無論是常量,還是實例字段,還是static字段,都不能包含。
public const int ID = 100;Error
*/
/*
* 接口中方法不能使用任何訪問修飾符(例如 public private internal protected)等修飾。(系統自動爲其設置爲public)
* public int CompareTo(Object obj);
*/
/*
* 不能使用virtual修飾(編譯器自動爲其設置爲public)
* virtual int CompareTo(Object obj);
*/
int CompareTo(Object obj);
void PrintMsg();
/*
* 接口中屬性不能使用任何訪問修飾符(例如 public private internal protected)等修飾。(系統自動爲其設置爲public)
* public String Name { get; }屬性本身類似方法,所以規則相同
*/
String Name { get; }
}
實現的類:
class Info:Lesson2.IComparable
{
//顯示實現接口方法時,不能添加任何訪問修飾符.即是private的,所以不可見,只能通過接口實例才能訪問這種方法。
//顯示實現接口方法主要用於實現多個接口,而這些接口有可能存在同名方法時使用(區別不同的接口方法)
int IComparable.CompareTo(object obj)
{
return 0;
}
//非顯示實現接口方法時,訪問級別必須是public(即子類方法覆蓋父類或實現接口時不能降低訪問級別)
public string Name
{
get { return "信息"; }
set { Console.WriteLine("設置信息"); }//儘管接口沒提供set;子類仍然可是添加set;
}
//非顯示實現接口方法時,訪問級別必須是public(即子類方法覆蓋父類或實現接口時不能降低訪問級別)
//可以把此方法聲明爲virtual,以便子類覆寫
public virtual void PrintMsg()
{
Console.WriteLine("你好,嘿嘿!");
}
}
使用:
Info info = new Info();
info.Name = "";
Console.WriteLine(info.Name);
//調用顯示實現的接口方法時,不能使用類實例,而要使用接口引用
IComparable cp = info;
Console.WriteLine(cp.CompareTo(1));//打印0
//由於printMsg方法不是通過顯示接口實現的,所以可以通過實例引用調用,也可通過接口引用調用(多態)
info.PrintMsg();//實例引用調用
cp.PrintMsg();//接口引用調用
Console.WriteLine(cp.Name);//接口引用調用屬性
抽象類:
//抽象類
abstract class abstractClass
{
//靜態構造函數,類似Java的靜態初始化塊,不能使用任何訪問修飾符,也不能有參數
static abstractClass()
{
Console.WriteLine("抽選類abstractClass的靜態構造函數");
}
public abstractClass()
{
Console.WriteLine("抽選類abstractClass的構造函數");
}
public abstractClass(String msg)
{
Console.WriteLine("抽象類 abstractClass 的重載構造函數abstractClass(String msg)");
}
public void Hi()
{
Console.WriteLine("實例方法 Hi()!");
}
public static void Say()
{
Console.WriteLine("靜態方法 Say()");
}
/*
* 構造函數不能是抽象的
public abstract abstractClass(int i);
*/
/*
* 靜態方法不能標記爲virtual、 abstract、 override
public abstract static void Say(int i);
*/
public abstract void printMsg(String msg);
}
//實現抽象類
class subClass : abstractClass
{
//靜態構造函數,類似Java的靜態初始化塊,不能使用任何訪問修飾符,也不能有參數
//C#中靜態構造函數調用順序和Java不一樣,C#是先調用本類的靜態構造函數,再調用父類的靜態構造函數。Java相反.
static subClass()
{
Console.WriteLine("subClass靜態初始化塊!");
}
public subClass(): base("我日!")
{
Console.WriteLine("subClass 構造函數!");
}
//抽象方法必須以override方式實現,與實現接口有點兒不一樣
public override void printMsg(string msg)
{
Console.WriteLine("printMsg打印的信息是:{0}",msg);
}
}
使用:
//抽象類使用
subClass sub = new subClass();
abstractClass.Say();//抽象類調用靜態方法
subClass.Say();//實現抽象類子類調用靜態方法(繼承的靜態方法)
abstractClass subabc = sub;
sub.printMsg("568");
subabc.printMsg("123");