簡體   English   中英

Function 覆蓋無虛擬和覆蓋

[英]Function overriding without virtual and override

我只有一個基本問題:

public class virtualTest
   {
       public virtual void vTest()
       {
           Console.WriteLine("Base Class");
       }
   }

   public class derivedVirtualTest : virtualTest
   {
       public override void  vTest()
        {
            Console.WriteLine("Derived Class");
        }
   }

在這里,我使用 function 覆蓋 function vTest()

但如果我:

public class virtualTest
   {
       public void vTest()
       {
           Console.WriteLine("Base Class");
       }
   }

   public class derivedVirtualTest : virtualTest
   {
       public void  vTest()
        {
            Console.WriteLine("Derived Class");
        }
   }

從各個位置刪除 virtual 和 override 關鍵字,然后代碼也可以工作。

這怎么可能?

或者,如果代碼在沒有虛擬和覆蓋的情況下工作正常,那么覆蓋和虛擬(整個 function 覆蓋)的用途是什么???

編輯:

我調用上述類的方法

 static void Main(string[] args)
        {



            derivedVirtualTest objderivedVirtualTest = new derivedVirtualTest();
            objderivedVirtualTest.vTest();

            virtualTest objvirtualTest = new virtualTest();
            objvirtualTest.vTest();

            Console.ReadLine();


        }

首先,您可以實現多態。 第二,你不能。

首先稱為overriding ,其次稱為hiddingshadowing (Vb.Net)

對此有很多疑問。

覆蓋與隱藏問題

重影和覆蓋MSDN之間的差異

正如 qwr 所解釋的,OOP 方面的主要區別是多態性。 這意味着如果您通過基類型引用訪問覆蓋基成員的類,則您對可覆蓋成員執行的調用將重定向到覆蓋。

如果類隱藏/隱藏基成員,則不會重定向調用,並且正在執行基類的方法。

所以,給定:

class Base
{
    public virtual void OverrideMe()
    {
        Console.WriteLine("I'm the base");
    }
}

class Derived : Base
{
    public override void OverrideMe()
    {
        Console.WriteLine("I'm derived");
    }
}

class Shadowing : Base
{
    public void OverrideMe()
    {
        Console.WriteLine("I'm shadowing");
    }
}

並以這種方式使用它們:

var instances = new Base[] {new Base(), new Derived(), new Shadowing()};

foreach (var instance in instances)
{
    instance.OverrideMe();
}

將產生:

我是基地

我是衍生的

我是基地

另一個區別是,在覆蓋的情況下,您可以改進基類,例如更改基成員的簽名或完全刪除它,而不更改隱藏的成員。 在某些情況下,這可能完全適合需求,而在某些情況下 - 不是那么多。

在覆蓋的情況下,您還必須更改覆蓋成員的簽名,否則您的代碼將無法編譯。

在第二個示例中,您可能會像這樣測試代碼:

derivedVirtualTest deviTest = new derivedVirtualTest();
deviTest.vTest();  //Result "Derived Class"

試試這個,你會看到這個函數還沒有被覆蓋:

virtualTest deviTest = new derivedVirtualTest();
deviTest.vTest();  //Result "Base Class"
//This will result "Dervived class" in the first one

當您的密封方法覆蓋方法時將需要它

public class Animal{  
    public virtual void eat() { Console.WriteLine("eating..."); }  
    public virtual void run() { Console.WriteLine("running..."); }  
  
}  
public class Dog: Animal  
{  
    public override void eat() { Console.WriteLine("eating bread..."); }  
    public sealed override void run() {   //If you skipped override here it will throws an error
    Console.WriteLine("running very fast...");   
    }  
}  
public class TestSealed  
{  
    public static void Main()  
    {  
        BabyDog d = new BabyDog();  
        d.eat();  
        d.run();  
    }  
}  

暫無
暫無

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

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