2017-08-30 109 views
1

例如,我有一個抽象類ShapeParent,它具有抽象方法CalculateArea();如何添加一個具有相似父對象和另一個具有相似對象列表的父對象到同一對象列表

public abstract class ShapeParent 
{ 
    public abstract void CalculateArea(); 
} 

然後,我有兩個子對象,它們擴展ShapeParent並實現CalculateArea();第一個是矩形:

public class Rectangle : ShapeParent 
{ 
    public override void CalculateArea() 
    { 
     //Area calculated here 
    } 
} 

,第二個是循環:

public class Circle : ShapeParent 
{ 
    public override void CalculateArea() 
    { 
     //Area calculated here 
    } 
} 

,並考慮場景,我也有一個通用的Shape類也擴展ShapeParent。此形狀類將成爲集合/列表中使用的所有其他形狀的通用容器。它有)呼籲的GetType(額外的方法,得到的基本形狀類型:

public class Shape : ShapeParent 
    { 
     public object UnderLyingShape { get; set; } 
     public override void CalculateArea() 
     { 
      ((ShapeParent)UnderLyingShape).CalculateArea(); 
     } 

     public Type GetType() 
     { 
      return ((ShapeParent)UnderLyingShape).GetType(); 
     } 
    } 

我會然後聲明如下列表:

private readonly List<Shapes> _myShapes = new List<Shapes>(); 

這一切工作正常,但考慮到當我想用一個新的方法CalculateVolume();添加一個新的形狀類型,這是一個可塑形狀,如Cylinder。到這個形狀列表。

這樣做的最好方法是什麼?我是否可以製作擴展ShapeParent的CylinderParent對象,以便它拾取CalculateArea()方法併爲Calculate對象然後實現的CalculateVolume()添加一個抽象定義?但是我可以將它添加到Shapes列表中,因爲常用對象是此對象的一個​​GrandParent,但其餘的是父對象?這是做這件事的最好方法嗎?

回答

1

我會考慮讓「Volumable Shape」成爲一個界面。即IVolumable。你也可以在面積計算中做到這一點(例如IAreaCalculable)。通過這種方式,您可以檢查shapeparent是否實現了特定的行爲並在可能的情況下調用它,如果不是可能忽略它,或者只是將形狀存儲爲List中想要的行爲。

說實話形狀可能也可能是一個接口,因爲這就是所有它似乎在示例中的行爲。

1

注意:如果明白你的代碼比形狀是子類的一個子類,那麼它是兄弟實際的實現。這是你的目標嗎?

隨着項目的增長,繼承樹可能變得非常龐大和複雜。相反,在分層樹上遍歷樹枝和樹葉,也許你可以試着用接口來抓取行爲。

例如,一個用於calculateArea的接口和一個用於音量的接口。你的形狀可以根據它們的行爲實現多個接口,你可以在基本接口列表中收集它們。

相關問題