C#中的这个名字是什么?

use*_*717 0 c# class derived definition

我正在读一本初学者的C#书.一切都很顺利定义像这样的对象:

BaseClass foo = new BaseClass();
Run Code Online (Sandbox Code Playgroud)

但是作者没有任何解释就改变了这样的定义:

MiClass foo = new DerivedClass();
Run Code Online (Sandbox Code Playgroud)

我想在书本或互联网上了解这一点,但我不知道用什么词来搜索这个主题.

The*_*kis 6

这个术语是子类型或替换.

当两种类型具有继承关系时,一个被称为子类型,另一个是超类型.当这适用时,子类型实例可以在期望超类型实例的上下文中使用(上下文是局部变量,字段,参数等).

这就是为什么你经常会听到继承表示一种is-a关系的原因.与组合(将对象包含为另一个对象的成员的实践)进行比较,它表示一个has-a关系(并且是在处理类时实现代码重用的另一种方式).

回到继承,如果您的类定义如下,例如:

class Banana : Fruit { ... }
Run Code Online (Sandbox Code Playgroud)

我们会说Banana(除了Banana显而易见)之外也是 Fruit如此.由于这种关系,你可以做到这一点,显然:

Banana obj = new Banana();
Run Code Online (Sandbox Code Playgroud)

但你也这样做:

Fruit obj = new Banana();
Run Code Online (Sandbox Code Playgroud)

每当字段或方法参数需要时,您都可以执行类似的操作Fruit.

当您希望您的代码使用对象的部分,但你不想让他们知道有关该对象的太多细节(也许是因为这些细节是不相关或如有变更)这种类型的关系是非常有用的.如果这些部分可以用较少的特定信息(在这种情况下,事物是某种事物Fruit而不是具体的事实Banana)来完成它们的工作,那么最好让它们使用它们.这是一种解耦形式,随着项目变得越来越复杂,这是代码的一般所需属性.