C#中抽象類和介面
阿新 • • 發佈:2019-02-05
一、抽象類:類是一個具有相同特徵和行為的抽象,而抽象類(class 前加上 abstract)沒有指出行為的具體細節,而由他的子類去實現相應的行為。
注意:一個非密封類(密封類使用 sealed 修飾)可以派生子類,子類可以是抽象類或非抽象類。
下面給出示例:
public abstract class BB { public int a; public void GetNum() { } public abstract void GetHeight(); } // 抽象類可以繼承自抽象類,不必實現父類的抽象方法 public abstract class DD:BB { // 自己的抽象方法 public abstract int GetMoney(); } // 非抽象類繼承自抽象類 BB,必須實現(需要加上重寫關鍵字:override ) BB 的都有抽象方法 public class EE:BB { public override void GetHeight() { } }
抽象類與非抽象類的區別:
1、抽象類使用 abstract 修飾,可以被繼承但不能被例項化(可以引用子類例項化物件),子類繼承自抽象類後必須實現該類的所有抽象方法;
2、抽象類中可以有抽象方法和非抽象方法,非抽象類不能有抽象方法,抽象方法一定要被子類重寫,而其他方法沒要求。
二、介面:當使用類的時候,僅關注其行為,不關心繼承時可以使用介面來代替類。
下面給出示例:
注意:介面的意義就是公共行為的載體,所以他的成員都是隱式公有的,不能加上修飾符。// 抽象類 public abstract class AbsClass { // 例項欄位 a public int a; // 只讀屬性 B public string B{get;} // 抽象方法 public abstract void Test(); } public class SubClass:AbsClass { // 重寫父類的抽象方法 public override void Test() { } } // 介面中的成員是隱式公有的,不能加修飾符 public interface IMyInterface { // 只讀屬性 int AA{get;} // 方法 void Test(); }
下面給出呼叫的示例:
// 父類的引用指向子類的例項化物件
AbsClass aa = new SubClass();
// 呼叫子類重寫後的方法
aa.Test();
抽象類和介面的區別:
1、抽象類中可以有實現成員(非抽象方法),而介面中的方法只有宣告沒有實現;
2、抽象類中可以有欄位,介面中不能有欄位,但可以有屬性;
3、抽象類的成員可以使用公有或其他修飾符,介面中成員是隱式公有的,不需要修飾;
4、抽象類是概念的抽象,介面注重行為,抽象類不支援多重繼承,而一個類可以實現多個介面。