[英]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();
}
正如 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.