java - 如何将具有相似父对象的一个​​对象和具有相似祖 parent 的另一个对象添加到同一对象列表

标签 java c# oop object

例如,我有一个抽象类 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() 的附加方法,用于获取基础 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>();

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

执行此操作的最佳方法是什么?我是否可以创建扩展 ShapeParent 的 CylinderParent 对象,以便它选择CalculateArea() 方法并添加CalculateVolume() 的抽象定义,然后Cylinder 对象将实现该抽象定义?但是我可以将其添加到形状列表中吗,因为公共(public)对象是该对象的祖 parent ,而其余对象的父对象?这是最好的方法吗?

最佳答案

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

说实话,Shape 也可能是一个接口(interface),因为这就是它在示例中的作用。

关于java - 如何将具有相似父对象的一个​​对象和具有相似祖 parent 的另一个对象添加到同一对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45965767/

相关文章:

java - 如何使用参数调用matlab函数并捕获java中的输出?

java - 使用泛型作为返回类型

c# - 从 ScrollView ( subview )内部将 View 推送到导航 Controller

Java:从 GUI 获取值

c++ - 在给定场景中访问类的公共(public)方法 - C++

java - 练习 AP CS 测试

java - 在 Java 中转换对象的不同方法

c# - 使用 Linq 从字典 C# 中删除特定值

c# - 中继器的项目命令事件未在链接按钮单击时触发

swift - 需要一些一般类(class)的建议