簡體   English   中英

覆蓋函數c#

[英]overriding a function c#

我只是試圖使用控制台應用程序來掌握虛擬功能的概念。 我注意到,一旦覆蓋基類函數, 返回baseclassname.functionname(參數)就會自動插入到我的函數體中。 為什么會這樣?

class advanc
{
    public virtual int  calc (int a , int b)
    {        
         return (a * b);        
    }        
}

class advn : advanc
{
     public override int calc(int a, int b)
     {
          //automatically inserted
          return base.calc(a, b);
      }        
}

通過重寫虛函數,可以擴展基類的功能,然后調用基類來實現“基本功能”。

如果要刪除' return base.calc(a,b) '行,則不會執行基類代碼。

如果要完全替換功能,這不是問題,但如果要擴展功能,則還應調用基類。

以下代碼演示了這一點(只需將其放在控制台應用程序中)

class advanc
{
    public virtual int calc(int a, int b)
    {
        Console.WriteLine("Base function called");
        return (a * b);
    }
}

class advn : advanc
{
    public bool CallBase { get; set; }
    public override int calc(int a, int b)
    {
        Console.WriteLine("Override function called");

        if (CallBase)
        {
            return base.calc(a, b);
        }
        else
        {
            return a / b;
        }
    }
}

private static void Main()
{
    advn a = new advn();

    a.CallBase = true;
    int result = a.calc(10, 2);
    Console.WriteLine(result);

    a.CallBase = false;
    result = a.calc(10, 2);
    Console.WriteLine(result);
    Console.WriteLine("Ready");
    Console.ReadKey();
}

Visual Studio試圖猜測你想要什么,所以它建議你這個代碼。

有時,重寫的函數會擴展基類函數的功能。 在這種情況下,在被覆蓋的內部的某處調用base.function是可行的。

這意味着當它調用base.calc時,它將調用它覆蓋的父函數。 如果你不想調用基本功能,你可以刪除它,但在大多數情況下它將保留(這就是visual studio auto生成它的原因)。

如果在高級函數中你不想調用a * b函數,你將刪除基函數調用並編寫自己的函數。

EG如果你在你的課程中聲明這個:

public override int calc(int a, int b)
{
   return Math.Pow(a, b);
}

調用此功能時,您將獲得以下內容:

advanc myObj = new advanc();
advn advnObj = new advn();

myObj.calc(5, 2); // will return 10
advnObj.calc(5, 2); // will return 25

IDE正在嘗試生成實際編譯的最簡單的重寫方法(所以如果你以后留下實際的實現,你仍然有一段代碼不會做太多但仍然編譯並產生一個可能不會導致的結果打破你的其余代碼)。

此外,在某些情況下,即使在實現之后,對基類的方法的調用也是有意義的:

  1. 您的子類的行為在基礎上擴展,但不會完全替換它
  2. 您正在使用裝飾器模式,但您的計算方法不需要更改(您仍然需要實現它,因為它是您正在裝飾的原始界面的一部分,但您只是將調用轉發到您的基類而不更改行為)

IDE只是插入對基本實現的調用。 這意味着,默認情況下,覆蓋的行為將與它覆蓋的方法相同。 如果這不是所需的行為(可能不是),只需使用您選擇的代碼重新進行操作即可。

默認情況下,VS提供至少執行父項在函數中執行的操作。 此外,在許多情況下,您需要運行父項,然后執行您的操作(例如,在UI情況下)。 對於base請參閱MSDN:

base關鍵字用於從派生類中訪問基類的成員:

 Call a method on the base class that has been overridden by another method. Specify which base-class constructor should be called when creating instances of the derived class. 

僅在構造函數,實例方法或實例屬性訪問器中允許基類訪問。

由於行return base.calc(a, b);自動調用基函數體return base.calc(a, b); 但是,您可以簡單地使基本函數體不會被自動調用,並像這樣調用您的owen:

    class advn : advanc
    {
        public override int calc(int a, int b)
        {
             return a * b; //anything else;
        }

    }

暫無
暫無

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

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