2017-01-07 12 views
0

車のコレクションがあるとします。 車は自転車、バイクまたは車でもよい。サブタイプを区別する方法は?

このコレクションのすべての車には、ウィンドウがクリーニングされている必要があります。

この車のコレクションを受け取るWindowCleanerがあります。 どの車で窓を清掃する必要があるのか​​を教えてください。 私は、WindowCleanerの車のサブタイプを区別すると、私はオープンクローズの原則に違反することに気付きます。

他にどのようにこれを行うことができましたか?抽象ブールプロパティNeedsWindowsCleanedを導入し、サブタイプにキャストしますか?これは、私には偽装のタイプイントロスペクションのように見えます。

私は、これはあなたが後にしている何かもしれないと思う
+1

[コード2つのオブジェクトのサブタイプに依存したときに処理するためにあるのデザインパターン](HTTPの可能性のある重複:// stackoverflowの.com/questions/32255687/is-there-a-design-to-handle-when-code-on-the-subtype-of-two-obje) –

答えて

1
using System; 
using System.Collections.Generic; 

namespace Dirty 
{ 
    class Program 
    { 
     static void Main() 
     { 
      var vehicles = new List<Vehicle>(); 

      var bike = new Bicycle(); 
      var motorbike = new Motorbike(); 
      var car = new Car(); 

      vehicles.Add(bike); 
      vehicles.Add(motorbike); 
      vehicles.Add(car); 

      foreach (var v in vehicles) 
      { 
       if (v.CleanWindows()) 
       { 
        Console.WriteLine("{0}", v); 
       } 
      } 

      Console.ReadKey(); 
     } 
    } 

    class Vehicle 
    { 
     public virtual bool CleanWindows() 
     { 
      return false; 
     } 
    } 

    class Bicycle : Vehicle 
    { 

    } 

    class Motorbike : Vehicle 
    { 

    } 

    class Car : Vehicle 
    { 
     public override bool CleanWindows() 
     { 
      return true; 
     } 
    } 
} 

- すべてのクラスは、「車両」&から継承彼らはデフォルトは「false」を取得しない場合は、必要に応じて...仮想「CleanWindows」メソッドをオーバーライドすることができます

私が誤解していないと思っている - 私はこのすべてに新しいです:)

関連する問題