例如,我有一个抽象类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而其余是父对象吗?这是最好的方法吗?
答案 0 :(得分:1)
我会考虑将“Volumable Shape”作为界面。即IVolumable
。您也可以为区域计算执行此操作(例如IAreaCalculable
)。通过这种方式,您可以检查shapeparent是否实现了特定的行为并在可能的情况下调用它,如果不能忽略它,或者只是将形状存储为List中所需的行为。
说实话,Shape也可能是一个界面,因为这似乎就像在示例中一样。
答案 1 :(得分:1)
注意:如果理解你的代码比形状是形状父类的子类,那么它是实际实现的兄弟。这是你的目标吗?
随着项目的增长,继承树可能变得非常庞大和复杂。而不是在层次结构树上遍历分支和叶子,您可以尝试使用接口来抓取行为。
EG。 calculateArea的一个接口和volume的一个接口。您的形状可以根据其行为实现多个接口,您可以在基本接口列表中收集它们。