簡體   English   中英

為什么抽象類可以有一個實例方法?

[英]why abstract class can have a instance method?

我們知道,如果一個類具有抽象方法,它將是抽象的。 它無法獲得實例。 但是為什么可以有一個實例方法? 有什么意義嗎?

public abstract class AbsClass
{
    public abstract void GetA();

    public void Getb()
    { }
}

並不是抽象類中的每個方法都必須是抽象的-當您從該類派生時,派生類將繼承基類的非抽象方法。 希望在所有派生類都具有的基類中提供功能是非常普遍的(實際上,將共享功能提升到基類中以避免在各個派生類中重復代碼是一種很好的編程習慣)。 希望在基類中提供“默認”功能,然后可以由各個派生類覆蓋這些功能,這是非常普遍的。

您無法實例化基類本身的事實並不重要-基類的非抽象方法在(非抽象)派生類的實例上調用。

是的,它有一個含義。

它可用於任何未明確實現自身的派生類。

派生類的示例:

public abstract class AbsClass
{
    public abstract void GetA();

    public void Getb()
    { }
}

public class DerivedClass : AbsClass
{

}

以下代碼將執行抽象類的Getb()代碼:

var derivedClass = new DerivedClass();
derivedClass.Getb();

(請注意,在上面的示例中,除非您的派生類實現了GetA(),否則該代碼將不會編譯,因為它被聲明為抽象,因此必須在任何具體的派生類中實現)

該方法將是從AbsClass派生的具體類的實現。 抽象意味着您不能創建該類的實例,也不意味着它不能具有任何實現方法。 您還可以在抽象類中具有實例數據成員。

舉個例子:

public class MyAbsClass : AbsClass
{
}

MyAbsClass mine = new MyAbsClass();
mine.Getb();  //This would call the implementation in AbsClass

但是,如果AbsClassinterface ,則不允許任何實現。

是的,它定義得很好。 在擁有實例之前,不能調用它,這又表明您必須具有具體的子類型,但是一旦完成,該方法就可以完美使用,例如:

AbsClass foo = new ConcreteClass();
foo.Getb();

或者確實是:

ConcreteClass foo = new ConcreteClass();
foo.Getb();

(因為子類型繼承了在基本類型上定義的任何類型)

這種方法本身通常使用類型的abstractvirtual方法,或者實際上是virtual這是很常見的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM