2011-08-05 10 views
4

私はこの質問のために、私は車のCARクラスになる永続的なオブジェクトを持っています。継承とOOPについての質問C#

public class Car 
{ 
    public string model {get;set} 
    public int year {get;set} 
} 

明らかに非常に単純化されています。

コードが開発されたので、私は当然パラメータとしてCARを受け入れる関数を作成しました。たとえば、次のように

public void PaintCar (Car theCar) 
{ 
    //Does some work 
} 

これまでのところは良いが、その後、私は、私は車に非常に類似していた別のクラスを、必要なシナリオを持っていたが、車はいくつかのフィールドがありませんでした。私は救助にOOPと思っ問題ありませんが、私はちょうどで終わるために、車から継承していないだろう:私は、私は車を投入するために使用していた非常に便利なユーティリティ関数に出くわしたまで

public class SuperCar : Car 
{ 
    public string newProp {get;set} 
    // and some more properties 
} 

をもう一度すべてが、桃に見えました元の特性。

Public void SetCarProperties(Car theCar) 
{ 
    //sets the properties for car here 
} 

私はmmmと思っていました。同じ関数を使って、上書きを必要とせずにsuperCarクラスのプロパティを設定したいと思います。スーパーカークラスのすべてのプロパティを含むように基本カー定義を変更したくない場合もあります。

この時点で私はジレンマを打ちました。オーバーライドは機能しますが、余分な作業です。より洗練されたソリューションがありますか?基本的には、スーパークラスをベースクラスを待っている関数に渡したいと思います。これはC#で可能ですか?よりエレガントな解決策がCarのプロパティといくつかを埋めるためにbaseを使用するCarクラス上の機能SetCarPropertiesを入れて、SuperCarでそれをオーバーライドすることである

Car myCar = new Car(); 
SetCarProperties(myCar); // ALL GOOD 

SuperCar mySuperCar = new SuperCar(); 
SetCarProperties(mySuperCar); // at the moment this function is expecting type Car... 
+2

この 'SetCarProperties'メソッドを' Car'クラスに持たせ、それを子クラス 'SuperCar'でオーバーライドする方が適切だと思います。 – NullUserException

+0

そうでなければ、オーバーライドは最もクリーンな解決策になると思います。 – NullUserException

答えて

12

:よう

私の最終的なコードの結果がものになるだろう追加のコードSuperCarプロパティを記入してください。

編集:別名多型。

+0

+1それは私が思ったものです。 – NullUserException

+0

それ以外の非常に洗練されたソリューションとして知られています。ありがとうございました! –

+1

さらに進歩するかもしれません。自動車がそれ自体を構築するのではなく、工場で構築されるのと同じように、おそらく多形的な建物の動作も同じように表現されるでしょう。のように、より派生した車のメソッドを使用するのとは対照的に、より派生したビルダーを取得します。 –

2

はオーバーライドを導入するが、原稿がセット・アップするために共通のプロパティ基底クラスバージョンを呼び出した:

public void SetCarProperties(Car car) 
{ 
    // set general properties 
} 

public void SetCarProperties(SuperCar veyron) 
{ 
    this.SetCarProperties((Car) veyron); 

    // SuperCar specific properties 
} 
+0

階層構造を頭で反転させ、 'Car'を基本クラスとし、そのメソッドをsecondと呼びます。もっと重要なことに、これは多相ではないので、 'Car 'として公開された' SuperCar'(一度このスニペットが修正されると*)を得た場合、より派生していないメソッドを使用してコンパイルし、完全に。 –

+0

@Anthony Pegram:ありがとうございました。私は「スーパー」という言葉で投げられたと思う。 –

+0

確かに、あなたがJavaなどの異なる背景から来た場合は、残念なことです。 –

-1

スーパー瘢痕=車をスーパーカーとして。 if(sCar!= null) { 瘢痕のプロパティを設定します。 }

車のプロパティを設定します。

+0

型チェックは、維持不能になる可能性があります。新しい派生車を追加するたびに、この方法に入り、更新する必要があります。 –