一、抽象類:類是一個具有相同特征和行為的抽象,而抽象類(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、抽象類是概念的抽象,接口注重行為,抽象類不支持多重繼承,而一個類可以實現多個接口。
---------------------
作者:cloproad
來源:CSDN
原文:https://blog.csdn.net/cloproad/article/details/78965488
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!