簡體   English   中英

在抽象類內的非抽象方法中調用抽象方法

[英]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.

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