为什么人们声明一个变量,即他们分配给它的对象的基类型
本文关键字:分配 他们 基类 对象 类型 变量 声明 一个 为什么 | 更新日期: 2023-09-27 17:56:08
下面是一个例子:
abstract class baseClass
{
void aMethod
{
//something here...
}
}
class derivedClass : baseClass
{
void aMethod
{
//something here...
}
}
void main()
{
baseClass Object_1 = new derivedClass();
}
为什么Object_1被声明为 baseClass?程序员为什么要这样做?Object_1是什么类型?它是baseClass还是derivedClass?如果我的Object_1是这样创建的,会有什么区别:
derivedClass Object_1 = new derivedClass();
?
我正在学习 C#,在这种情况下,这是我最感兴趣的环境。
为什么使用 baseClass 类初始化Object_1?
其实不然。看看new
后面是什么类型,它是派生类型。此处包含的是使用基类型作为引用类型引用的派生类型实例。
程序员为什么要这样做?
具有类型化引用意味着可以使用对象的成员。根据所使用的层次结构的实际类型,您可以访问相应的成员集。
Derived o = new Derived()
o.xxx <- full access to instance members
Base o = new Derived()
o.xxx. <- access is limited to members that are defined in the Base class
object o = new Derived()
o.xxx. <- you can always see an instance as of 'object' type
and have most limited interface
请注意,每次实例的实际类型都是Derived
,但由于某种原因,您决定通过不同的"眼镜"来看待它。
Object_1是什么类型
实际类型始终是位于new
运算符之后的类型。
如果我的Object_1是这样创建的,会有什么区别:
实例本身没有区别,但您可以以不同的方式访问其成员。在 C# 等语言中,您始终可以安全地将实例强制转换为其基类型(或层次结构中的任何类型),但请注意,您不能总是在层次结构中执行相同的操作:
Derived1 d = new Derived1();
Base b = (Base)d;
// d and b point to the very same instance but they differ on what properties you are allowed to access
Derived2 d2 = (Derived2)b;
// casting to a derived type would work only if the instance was of this actual type
// in a worst case such cast would then end with a run-time error
一个实际的例子:你想把一个东西的集合传递给一个方法。该方法应该对每件事做一些事情。
在将集合传递给方法之前,必须创建集合。若要创建事物的集合,您需要一个具有 Add 方法的类。一个列表类就可以了。
对于接收方法,将内容添加到集合的功能无关紧要。它只需要能够枚举集合中的内容。所以你传递的是IEnumerable,而不是List。
通常,将实例分配给基类型变量可以消除干扰并缩小做出假设的空间。它说"在这一点上,子类型无关紧要,所以这并不比基本类型更复杂。这让头脑放松了。