什麼是現實生活場景,我們將使用new爲派生類中的虛擬方法提供新的實現? C#新關鍵字的真實用法隱藏虛擬方法實現? c#
我知道這意味着什麼技術上。我正在尋找的是真實的生活場景,這將需要。
我們總能提供覆蓋功能實現同樣的。爲什麼我們希望在方法調用被轉移到基地時選擇了不正確的方法。
什麼是現實生活場景,我們將使用new爲派生類中的虛擬方法提供新的實現? C#新關鍵字的真實用法隱藏虛擬方法實現? c#
我知道這意味着什麼技術上。我正在尋找的是真實的生活場景,這將需要。
我們總能提供覆蓋功能實現同樣的。爲什麼我們希望在方法調用被轉移到基地時選擇了不正確的方法。
號不能達到相同的。
// Define the base class
class Car
{
public virtual void DescribeCar()
{
System.Console.WriteLine("Four wheels and an engine.");
}
}
// Define the derived classes
class ConvertibleCar : Car
{
public new virtual void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("A roof that opens up.");
}
}
class Minivan : Car
{
public override void DescribeCar()
{
base.DescribeCar();
System.Console.WriteLine("Carries seven people.");
}
}
現在,如果你試着這樣做:
public static void TestCars2()
{
Car[] cars = new Car[3];
cars[0] = new Car();
cars[1] = new ConvertibleCar();
cars[2] = new Minivan();
}
結果將是:
Car object: YourApplication.Car
Four wheels and an engine.
----------
Car object: YourApplication.ConvertibleCar
Four wheels and an engine.
----------
Car object: YourApplication.Minivan
Four wheels and an engine.
Carries seven people.
----------
覆蓋始終覆蓋而新的只做它時,作爲其聲明的類型(不是基於一個)。
我正在尋找真實的生活scenerio ..這是一本書..無論如何..由喬恩給出的簡單基地secenerio回答它 – ParvindS
不,你不能通過重寫實現相同的:
一個前充足的場景:
在這一點上,你希望所有現有代碼調用Bar.DoSomething到仍然呼叫Bar.DoSomething,但所有這些都要求Foo.DoSomething代碼應該仍然調用的實現 - 這些來電者不得甚至知道你的方法,他們可能會在第三方組件。
從長期來看,如果可以的話,您可能想重命名您的方法(取決於您對呼叫者有多少控制權),但在短期內,使您的方法達到您的行爲想。
這種東西有時被稱爲易碎基類的問題。埃裏克·利珀特已經寫了相當廣泛的,其中包括this post back in 2004。
虛擬方法可以重新定義。 virtual關鍵字指定派生類中重寫的方法。我們可以添加派生類型而不修改程序的其餘部分。對象的運行時類型因此決定了行爲。
更好的討論在http://programmers.stackexchange.com/ –