Java 如何将一个具有相似父对象的对象和另一个具有相似祖辈对象的对象添加到同一对象列表中

Java 如何将一个具有相似父对象的对象和另一个具有相似祖辈对象的对象添加到同一对象列表中,java,c#,oop,object,Java,C#,Oop,Object,例如,我有一个抽象类ShapeParent,它有一个抽象方法CalculateArea() 然后我有两个子对象,它们扩展了ShapeParent并实现了CalculateArea();第一个是矩形: public class Rectangle : ShapeParent { public override void CalculateArea() { //Area calculated here } } 第二个是圆: public class Circ

例如,我有一个抽象类ShapeParent,它有一个抽象方法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
    }
}

并考虑一个场景,在这里我还有一个通用形状类,它也扩展了SeabePrime.此形状类将是集合/列表中使用的所有其他形状的通用容器。它还有一个名为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>();
private readonly List_myShapes=new List();
<>这一切都很好,但是当我想用一个新的方法CalpAtgEngEuMe()添加一个新的形状类型时,它是一个可变形的形状,比如一个圆柱体;添加到此形状列表


最好的方法是什么?我是否可以使CylinderParent对象扩展ShapeParent,以便它选择CalculateArea()方法并为CalculateEvolume()添加一个抽象定义,然后圆柱体对象将实现这个抽象定义?但是,我可以将其添加到形状列表中吗?因为公共对象是此对象的祖父母,而其他对象是父对象?这是最好的方法吗?

< P>我会考虑让“可变形的形状”成为一个接口。i、 e.
i可溶解
。您也可以在面积计算中这样做(例如,
iareacalculate
)。通过这种方式,您可以检查shapeparent是否实现了特定的行为,并在可能的情况下调用它,如果没有,则可以忽略它,或者只是将形状作为您想要的行为存储在列表中


老实说,Shape也可能是一个接口,因为这就是它在示例中所起的作用。

注意:如果对代码理解得很好,Shape就是Shape父类的一个子类,因此它是实际实现的同级。这是你的目标吗

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

一个接口用于计算器ea,一个接口用于音量。您的形状可以根据其行为实现多个接口,您可以在基本接口列表中收集它们

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