2011-12-09 13 views
1

最近私はクラス継承を研究しており、この特定のコードを続けています。何ここで私が混乱することは、それが道を作成することがなぜ私は理解していないこと、それが私だったら、私はタイプのバーでバーのインスタンスを作成します..."派生クラス"タイプのオブジェクトの作成

Bar test = new Bar(); 

ある

public class Foo {  

public bool DoSomething() 
{ 
    return false; 
} 
} 

public class Bar : Foo { 

public new bool DoSomething() 
{ 
    return true; 
} 
} 

public cass Test { 

    public static void Main() { 

    Foo test = new Bar(); 

    Console.WriteLine (test.DoSomething());  
    } 
} 

それはコード内にあります。

+1

あなたが探している答えは、BrokenGlassの答えと多形性と混じったJustinの答えが混ざっているところにあります。残念ながら、そのような意味には簡単な答えはありません。 Factory Patterns、IoCまたはDependency Injectionに慣れる必要があります。工場パターンはおそらく最も簡単なものです。経験がなければ、複雑な細部を分解するための本が必要です。ヘッドファーストデザインパターンは優れた選択です。 –

答えて

3

このコードはおそらく基底クラスのメソッドを隠しとをオーバーライドとの違いを示すために書かれました:

この場合、使用してBarオブジェクトをインスタンス化しますFoo変数は基本クラスメソッドDoSomething()を使用し、falseを出力します。 DoSomething方法は、基本クラスに仮想として宣言されていたし、出力は次の例のようにtrueだろう派生クラスでオーバーライドされて:

public class Foo {  

public virtual bool DoSomething() 
{ 
    return false; 
} 
} 

public class Bar : Foo { 

public override bool DoSomething() 
{ 
    return true; 
} 
} 
+0

私はコードの目的を知っていますが、私が理解していないのは、サブクラスのインスタンスを作成するときにスーパークラスを参照として使用することです。スーパークラスメソッドが仮想であれば、実際にはどんなメリットがありますか? – Zizo47

+0

その他のほとんどの答えは、具体的なクラスの代わりにベースクラス(および/またはインターフェイス)を使用する利点に潜んでいます。何が具体的ではなく抽象に依存したいので、後で実際の実装を変更できます。 - これが多形性の基礎であり、IoC/Depedency Injectionなどの機能をはるかに強力にします – BrokenGlass

0

一般に、そうではありません。より現実的な例が、この場合、

void DoSomethingWithAFoo(Foo f) { 
    f.DoSomething(); 
} 

だろう、fFooまたはBar可能性があり、かつDoSomethingWithAFooは知っているか、気にする必要はありません。

0

BarFooから派生しているため、Barのインスタンスを作成し、Fooという参照に割り当てても完全に有効です。あなたが示したコード例は、BarFooであることを示しているだけであり、したがって割り当て可能であると思われます。

1

実世界のオブジェクトでこれらのことを考えるのは簡単です。

車について考えてみてください。あなたは異なる車種/車種を持つことができますが、それぞれの車は同じ基本機能を実行します。

あなたのコードはオブジェクトと同じように動作します。あなたはどんな車で動作するようにコードを書いていますが、本当にあなたが欲しい車のいずれかのメイク/モデルを指定することができます、

public class Car 
{ 
    public virtual void Drive() 
    { 
    } 
} 

public class ChevyVolt : Car 
{ 
    public override void Drive() 
    { 
     // Initialize the battery and go 
    } 
} 

public class CadillacEscalade : Car 
{ 
    public override void Drive() 
    { 
     // Check to ensure you have an oil field worth of gas and go 
    } 
} 

それらの定義で...あなたは車を運転する責任クラスを作成することができます。どの車かは関係ありません。あなただけの運転を心配する必要があります。

public class Commuter 
{ 
    public void GoToWork() 
    { 
     // Garage.PickCar() could return either ChevyVolt or an Escalade 
     Car todaysRide = Garage.PickCar(); 

     // Now that we have a car, go to work 
     todaysRide.Drive(); 
    } 
} 
0

あなたは以下総称して、より一般的な(フー)を割り当てることができます型(Boo)これは通常多型を利用するときに行われます。古典的な例ではAnimal、Dod、Catを持っていて、Animal=new Dog()またはAnimal=new Cat()と言うことができます。次に仮想関数を呼び出して、適切な関数を自動的に呼び出すことができます。これは新しい機能でDoSomething関数をオーバーラップさせているためです。

0

Fooで定義されている機能がほしいと思うのであれば、それはもっと意味があるかもしれません。 Barは、Barが何であれ、より多くの機能を自由に追加できます。

public class Bar : Foo { 

public new bool DoSomething() 
{ 
    return true; 
} 

public bool IsValid {get;} 
} 

今、呼び出し元のコードがだけなのでFooによって定義された抽象化を気に、あなたはBarを作成しているという事実にもかかわらず、あなただけBar.IsValidFoo(ちょうどDoSomething)によって定義された契約書を取得し、それゆえされていない機能Iだけ定義された。

関連する問題