[英]Calling an abstract method in a non-abstract method within an abstract class
我在C#中有一個抽象類:
public void activation()
{
activated = true;
on_Activation();
}
protected abstract void on_Activation();
場景:
假設我已經成為抽象類的子代,並實現了on_Activation()
方法的實現。
問題:
Activation()
時會發生什么? on_Activation()
使用的實施on_Activation
在子類? 是。 這是一個虛擬方法(隱式,因為它是抽象的),因此將調用其“最被覆蓋”的版本。 調用源自基類上定義的方法的事實沒有區別。
是。 您剛剛發現了多態性 。 多態意味着您只需要在一個對象(無論當前對象名為this
還是任何其他對象)上調用諸如on_Activation
類的方法,而無需指定您所指的on_Activation
版本。 它是運行時對象的實際類型 ,它決定實際調用哪個版本的on_Activation
。
正如Thomas所指出的那樣,以這種方式運行的方法稱為virtual 。 所有抽象方法在C#中都是虛擬的。 因此,虛擬方法是一個名稱,符號,可以在運行時多態地引用不同的事物(不同的方法主體 )。
如果您好奇並且想知道涉及哪種魔術,則可以在“ 虛擬方法表”中查看詳細信息。 本質上,每個虛擬方法名稱(如on_Activation
都將轉換為索引(如n
,即該類的第n
個虛擬方法。 每個非抽象類都提供一個表,其中指定了其所有虛擬方法主體 。 因此, on_Activation
對象的on_Activation
的調用轉換為對該對象類的虛擬方法表中的第n
個條目的調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.