2011-07-29 39 views
5

什麼是現實生活場景,我們將使用new爲派生類中的虛擬方法提供新的實現? C#新關鍵字的真實用法隱藏虛擬方法實現? c#

我知道這意味着什麼技術上。我正在尋找的是真實的生活場景,這將需要。

我們總能提供覆蓋功能實現同樣的。爲什麼我們希望在方法調用被轉移到基地時選擇了不正確的方法。

+0

更好的討論在http://programmers.stackexchange.com/ –

回答

6

號不能達到相同的。

// 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. 

---------- 

覆蓋始終覆蓋而新的只做它時,作爲其聲明的類型(不是基於一個)。

可以see more here

+1

我正在尋找真實的生活scenerio ..這是一本書..無論如何..由喬恩給出的簡單基地secenerio回答它 – ParvindS

4

不,你不能通過重寫實現相同的:

  • 指定一個新的方法,可以改變返回類型
  • 調用基方法可能不是不正確的

一個前充足的場景:

  • 您正在使用第三方庫美孚,其中包含一類FooBase
  • 你寫你自己的Foo子類,酒吧
  • 您介紹在酒吧的公共方法叫做DoSomething的
  • 在下一個版本的Foo中,第三方在Foo中引入了DoSomething方法,它與您的方法不一樣。這可能也可能不是虛擬的。

在這一點上,你希望所有現有代碼調用Bar.DoSomething到仍然呼叫Bar.DoSomething,但所有這些都要求Foo.DoSomething代碼應該仍然調用的實現 - 這些來電者不得甚至知道你的方法,他們可能會在第三方組件。

從長期來看,如果可以的話,您可能想重命名您的方法(取決於您對呼叫者有多少控制權),但在短期內,使您的方法達到您的行爲想。

這種東西有時被稱爲易碎基類的問題。埃裏克·利珀特已經寫了相當廣泛的,其中包括this post back in 2004

0

虛擬方法可以重新定義。 virtual關鍵字指定派生類中重寫的方法。我們可以添加派生類型而不修改程序的其餘部分。對象的運行時類型因此決定了行爲。