为什么儿童类不受父母的财产限制?

时间:2013-06-19 07:32:02

标签: c# oop

假设我有两个课程如下:

class Fruit
{
    public string color { get; set; }
}
class Orange : Fruit
{
    public double diameter { get; set; }
}

然后在水果变量

中创建一个橙色对象
Fruit fruit = new Orange() { color = "Orange", diameter = 10.0 };

// This line prints 10 even though the Fruit class doesn't contain a
// diameter property
Console.WriteLine( ( (Orange) fruit ).diameter );

为什么整个橙子,包括直径属性,可以挤入水果变量?为什么水果变量不受Fruit类定义的限制?

如果我将新的Orange放在Orange变量中,会有什么不同,如本例所示?

Orange fruit = new Orange() { color = "Orange", diameter = 10.0 };

我能找到的唯一区别是如果我对变量进行类型测试,并且在使用对象之前我不需要演员。但它必须有更多,对吧?

3 个答案:

答案 0 :(得分:5)

Fruit是一种概括,而Orange是一种专业化。专用对象可以即兴创建现有的继承属性,也可以添加特定于其的属性。

为什么整个橙子,包括直径属性,可以挤进水果变量?

fruit只是一个引用变量,但它引用了可能在堆中的新Orange对象。 Orange对象的定义足以容纳diameter属性。超类引用类型可以引用子类对象。这样就可以实现多态性。如果您执行此类fruit.color之类的操作,那么在运行时,您可以访问扩展color且其Fruit当前引用的对象的任何子类的fruit属性。

为什么水果变量不受Fruit类定义的限制?

执行此操作时:

Fruit fruit = new Orange() { color = "Orange", diameter = 10.0 };

您正在给自己一个机会在代码中实现 Polymorphism 。如果声明一个方法将Fruit类型作为参数传递,那么您可以使用Fruit类型引用变量来访问属性或在其上调用方法,而不会将您的方法实际限制为特定的Fruit类型。将来,如果您要将特定水果从Orange更改为Apple,其中Apple延伸Fruit,那么您可以重复使用该方法并确保至少Fruit中定义的方法或属性适用于特定的水果类型。

如果我把新的Orange放在Orange变量中,那会有什么不同

正如我前面提到的,如果你使用特定的类型引用,那么你就无法利用多态性。

答案 1 :(得分:1)

这称为运行时多态。 Orange扩展了水果并添加了新属性,例如 diameter 。 当您创建Orange的对象并将其放入Fruit时,它会保留其属性,只有该水果无法解决这些问题。然后,您需要再次Orange Fruit来获得直径。

来自Wikipedia

  

在计算机科学中,多态性是一种编程语言特性,它允许使用统一的接口处理不同数据类型的值。参数多态的概念适用于数据类型和函数。可以评估或应用于不同类型的值的函数称为多态函数。可以看起来是通用类型的数据类型(例如,具有任意类型的元素的列表)被指定为多态数据类型,类似于进行这种特化的通用类型。

答案 2 :(得分:0)

这主要是因为你正在创造橙色而水果是橙色的概括。它只是一个实际的Orange对象的包装器。重要的是你正在创造橙色并将其指定为水果,但水果是橙色。如果你这样做

Fruit _fruit = new Fruit()

会有所不同。你正在创造橙色,橙色继承自水果,这就是你可以这样写的原因。