如何将具有相似Parent的一个对象和具有类似GrandParent的另一个对象添加到同一个Object List

时间:2017-08-30 16:44:47

标签: java c# oop object

例如,我有一个抽象类ShapeParent,它有一个抽象方法CalculateArea();

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

然后我有两个扩展ShapeParent的子对象并实现CalculateArea();第一个是Rectangle:

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()的附加方法,它获取底层的Shape类型:

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>();

这一切都运行正常,但考虑我想添加一个新的Shape类型,它是一个可卷曲的形状,如Cylinder,使用新方法CalculateVolume();到这个形状列表。

最好的方法是什么?我可以创建扩展ShapeParent的CylinderParent对象,以便它获取CalculateArea()方法并为CalculateVolume()添加一个Cylinder对象随后会实现的抽象定义吗?但是我可以将它添加到Shapes列表中,因为公共对象是此对象的GrandParent而其余是父对象吗?这是最好的方法吗?

2 个答案:

答案 0 :(得分:1)

我会考虑将“Volumable Shape”作为界面。即IVolumable。您也可以为区域计算执行此操作(例如IAreaCalculable)。通过这种方式,您可以检查shapeparent是否实现了特定的行为并在可能的情况下调用它,如果不能忽略它,或者只是将形状存储为List中所需的行为。

说实话,Shape也可能是一个界面,因为这似乎就像在示例中一样。

答案 1 :(得分:1)

注意:如果理解你的代码比形状是形状父类的子类,那么它是实际实现的兄弟。这是你的目标吗?

随着项目的增长,继承树可能变得非常庞大和复杂。而不是在层次结构树上遍历分支和叶子,您可以尝试使用接口来抓取行为。

EG。 calculateArea的一个接口和volume的一个接口。您的形状可以根据其行为实现多个接口,您可以在基本接口列表中收集它们。