2017-08-30 107 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的接口和一个用于音量的接口。你的形状可以根据它们的行为实现多个接口,你可以在基本接口列表中收集它们。

相关问题