2012-05-03 8 views
0

次のクラスを持つ3番目の.NETライブラリを使用しています。C#派生型の処理、リファクタリング

形状(抽象基底クラス)

(彼から派生したすべての以下のクラス)

長方形

サークル

トライアングル

これらのクラスのすべてのプロパティを持っていますエリア

私は形状の配列を通過し、領域を設定します

P.S:領域はShapeのプロパティではなく、代わりに各クラスのプロパティです。

ので、私のコードは次のようになります。

if (shapeVar is Reactangle) 
{ 
    (shapeVar as Rectangle).area = value; 
} 

if (shapeVar is Circle) 
{ 
    (shapeVar as Circle).area = value; 
} 

if (shapeVar is Triangle) 
{ 
    (shapeVar as Triangle).area = value; 
} 

はこれを行うには良い方法はありますか? 私はあるもののあなたは、各形状の面積のプロパティにアクセスするためにリフレクションを使用することができ、.NET 4

答えて

2

を使用しています、それは愚かであるように私は感じるが、私はそれを

を行うために他の方法を見つけることができませんでした小さなパフォーマンスコスト:

shapeVar.GetType().GetProperty("area").SetValue(shapeVar, value, null); 
+0

お返事ありがとうございます。私はコードをそのまま保ちました。私はリフレクション –

0

なぜ、領域を設定するのではなく派生型から返すメソッドにするのはなぜですか?

public abstract class Shape 
{ 
    abstract public double Area(); 
} 

public class Square : Shape 
{ 
    double sideLength; 
    public double Area 
    { 
     return sideLength * sideLength; 
    } 
} 

public class Circle : Shape 
{ 
    double radius; 
    public double Area 
    { 
     return Pi * r * r; 
    } 
} 

あなたが設定領域に固執したい場合は、基底クラスにあなたの地域を移動できます。

public abstract class Shape 
{ 
    public double Area; 
} 

public class Square : Shape 
{ 
    ... 
} 

、あなたはあなたができる派生型に基づいて領域を設定形状に目を通します:

foreach (Shape shape in shapes) 
    switch(typeof(shape)) 
    { 
     case typeof(Square)) 
     { 
      shape.Area = value; //I imagine this is derived type specific 
      ... 
     } 
    } 
+0

を使用したくないと著者はすでに述べています。これらのクラスはすべて第三者のライブラリから来ています。 –

1

ます(サードパーティのアセンブリから来る)長方形、円や三角形のクラスをラップすることができますし、独自のコードで3つの新しいクラスを作成します。

 public interface IShape 
     { 
      double Area{get;set;} 
     } 

は、この共通インターフェイスを実装するために包まれたクラスを作成します。

次に、例えばのためのインターフェイスを持つことができます。

その後、実際の具体的なクラスが何であるかを知らなくても、これらのクラスの3つすべてを共通の方法でコード内で使用できます。 (シェイプベースタイプではなくインターフェイスタイプを参照して)

関連する問題