2012-05-03 58 views
0

我使用具有以下類第三部分.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

爲什麼不讓Area成爲從派生類型返回而不是被設置的方法?

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

作者已經提到所有這些類都來自第三方庫。 – 2012-05-03 18:22:41

1

你可以包裝Rectangle,Circle和Triangle類(來自第三方程序集),並在你自己的代碼中創建3個新類。

然後你就可以有e.g接口:

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

使被包裝類來實現這個共同的接口。

之後,您可以以普通方式在代碼中使用這三個類,而無需知道它們的實際具體類是什麼。 (通過參考接口類型,而不是形狀的基類型)