c#将子类声明为类型超类

PMS*_*PMS 8 c# inheritance

我似乎无法找到这个继承问题的满意答案.为什么有时会声明这样的子类型:

Shape myCircle = new Circle();
Run Code Online (Sandbox Code Playgroud)

还有其他时间?

Circle myShape = new Circle();
Run Code Online (Sandbox Code Playgroud)

当圆是一个孩子/子类Shape.....

在我阅读的OO书籍中似乎没有一致性,并且我可以解释一下我的解释.人们已经向我展示了一个Shapes类的例子被实例化为圆形,正方形等......但是我不明白你何时使用第一个声明和第二个声明.

das*_*ght 7

通常希望以多态方式处理具体类的对象,以避免在可以避免它们的特定类型上创建依赖关系.例如,如果您要创建一个Circle用于绘制它Draw()的方法,并且是a的方法Shape,那么最好将其声明myCircle为形状,以防您稍后决定将其替换为方形.

另一方面,如果你的意图是做一些特定的事情Circle,比如设置它的半径,那么你需要声明myCircleCircle,因为SetRadius()可能没有Shape.


Kev*_*lia 4

也许您有一个形状列表,并且您并不特别关心它们是什么类型的形状,因为您需要对该列表执行的操作对于所有形状都是通用的(即绘制),您可能希望将它们添加到列表中,例如这

List<Shape> shapeList = new List<Shape>();
shapeList.Add(new Circle());
shapeList.Add(new Rectangle());
foreach (Shape shape in shapeList)
{
    shape.Draw();
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以访问实际上是不同类型但共享公共父对象的对象上形状的通用方法。然后,如果您想做一些特定于圆圈的事情,您可以使用像这样的相同列表。

foreach (Shape shape in shapeList)
{
    if (!(shape is Circle)) continue;
    Circle circle = shape as Circle;
    circle.Radius = 100;
}
Run Code Online (Sandbox Code Playgroud)