假设我有两个课程如下:
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 };
我能找到的唯一区别是如果我对变量进行类型测试,并且在使用对象之前我不需要演员。但它必须有更多,对吧?
答案 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
来获得直径。
在计算机科学中,多态性是一种编程语言特性,它允许使用统一的接口处理不同数据类型的值。参数多态的概念适用于数据类型和函数。可以评估或应用于不同类型的值的函数称为多态函数。可以看起来是通用类型的数据类型(例如,具有任意类型的元素的列表)被指定为多态数据类型,类似于进行这种特化的通用类型。
答案 2 :(得分:0)
这主要是因为你正在创造橙色而水果是橙色的概括。它只是一个实际的Orange对象的包装器。重要的是你正在创造橙色并将其指定为水果,但水果是橙色。如果你这样做
Fruit _fruit = new Fruit()
会有所不同。你正在创造橙色,橙色继承自水果,这就是你可以这样写的原因。