2011-07-29 10 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(); 
} 

結果は以下のようになります。新しいONLYそれはときに宣言された型として使用されない間

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..andこの1つが本のため..ですジョンによって与えられたanyway..brittleベースsecenerioはそれに答えます – ParvindS

4

することができません、あなたをオーバーライドすることで同じことを達成することはできません。

  • の新しい方法を指定するには、あなたが基本メソッドを呼び出すと戻り値の型
  • を変化させることができますいいえが間違っている

1つ前十分なシナリオ:

  • あなたはサードパーティのライブラリはFooを使用している、FooBase
  • クラスが含まれてい
  • あなたがバーでのパブリックメソッドを紹介フー、バー
  • の独自のサブクラスを作成するには、
  • のdoSomethingと呼ばれますFooの次のバージョンでは、サードパーティーはあなたのメソッドと同じことをしないFooにDoSomethingメソッドを導入しています。これは仮想的であってもなくてもよい。この時点で

、すべてのあなたのまだコールBar.DoSomethingにBar.DoSomethingを呼び出す、既存のコードをしたいが、Foo.DoSomethingを呼び出すすべてのコードはまだその実装を呼び出す必要があります - しないことがあり、それらの発信者をあなたの方法についてはでもを知っていて、サードパーティのアセンブリに含まれている可能性があります。

長期的に見ると、できるだけ多くのコントロールを呼び出し側に持っていても、メソッドの名前を変更したいのですが、短期間にメソッドをnewとして実行すると、欲しいです。

この種のことは時々脆いベースクラス問題として知られています。 Eric Lippertは、this post back in 2004を含めてそれについてかなり広範囲に書いています。

0

仮想メソッドを再定義することができます。 virtualキーワードは、派生クラスでオーバーライドされるメソッドを指定します。残りのプログラムを変更することなく派生型を追加できます。したがって、ランタイム・タイプのオブジェクトは動作を決定します。より良い

関連する問題