为什么人们声明一个变量,即他们分配给它的对象的基类型

本文关键字:分配 他们 基类 对象 类型 变量 声明 一个 为什么 | 更新日期: 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。

通常,将实例分配给基类型变量可以消除干扰并缩小做出假设的空间。它说"在这一点上,子类型无关紧要,所以这并不比基本类型更复杂。这让头脑放松了。