簡體   English   中英

在 C# 中,對於基礎 class 的虛擬/抽象方法,在派生 class 中,覆蓋修飾符是強制性的

[英]In C# override modifier is mandatory in derive class for virtual/abstract methods of base class

public class Shapes
{
  public virtual void Color()
  {
    Console.WriteLine("Shapes");
  }
}

public class Square : Shapes
{
  public void Color()
  {
    Console.WriteLine("Square");
  }
}

public class Test
{ 
  public static void main()
  {
    Shapes s1 = new Shapes();
    s1.Color();
    Shapes s2 = new Square();
    s2.Color();
  }
}

我想知道基礎 class 是否定義了一些虛擬方法,那么在派生 class 中是否必須覆蓋它們? 同樣,如果基礎 class 方法是抽象的,我們需要在派生 class 中實現該方法,但是覆蓋修飾符是強制性的嗎? 如果忽略了 override 修飾符會怎樣。

我想知道基礎 class 是否定義了一些虛擬方法,那么在派生 class 中是否必須覆蓋它們?

當然不。 由派生的 class 決定是否覆蓋虛擬方法。 請注意,某些類會建議派生類在某些情況下覆蓋特定的虛擬方法,但編譯器不會強制執行。

如果基礎 class 方法是抽象的,我們需要在派生 class 中實現該方法,但是覆蓋修飾符是強制性的嗎?

是的,需要使用override關鍵字,否則方法會被派生的class中的定義隱藏。

如果您實際運行您的代碼,您將看到“形狀”打印了兩次。 這是因為Squares class 中的Color()方法沒有使用override關鍵字聲明。 因此,它隱藏了基本 class 方法。 這意味着它只能通過Squares類型的變量訪問:

Sqares s3 = new Squares();
s3.Color();

這將打印“Square”,因為您在正確類型的變量上調用該方法。

看看這個鏈接,它可能有用。

該頁面中的副本:

要使方法虛擬化,必須在基礎 class 的方法聲明中使用virtual修飾符。 派生的 class 然后可以使用override關鍵字覆蓋基本虛擬方法,或使用 new 關鍵字隱藏基本 class 中的虛擬方法。 如果未指定override關鍵字和new關鍵字,編譯器將發出警告,派生 class 中的方法將隱藏基 class 中的方法

從您發布的示例代碼中可以看出,output 將是

Shapes
Shapes

這是因為通過省略override關鍵字,您默認隱藏基本 class 方法 - 這意味着該方法不能再以多態方式使用 - 即使s2Square的一個實例,因為用於調用該方法的 object 引用是Shapes , 使用Shapes方法。

另一方面,如果該方法被標記為override ,它甚至會在類型為Shape的 object 引用上調用,因為使用了給定實例的 inheritance 樹中最派生的Color()方法。

它完全基於您在問題的第一部分中的邏輯,In Square class 派生自 Shapes class 您聲明將隱藏其父虛擬 Color 方法的 Color 方法,您不需要在子 ZA2F2ED4F8EBC2CBB4C21A29DC4 中復制相同的方法存在於它的父類中,除非你想隱藏父類的方法。 在抽象 class 中,如果您有一個虛擬方法,則必須在派生類中實現或覆蓋它們,在您采樣這些 Shapes 的實例時,將調用 Shapes class 中的虛擬 Color 方法。

暫無
暫無

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

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