以下是一个例子:
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#,在这种情况下,这是我最感兴趣的环境。
答案 0 :(得分:1)
为什么使用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
时,由于某种原因,您决定通过不同的眼镜&#34;来查看它。
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
答案 1 :(得分:1)
一个实际示例:您希望将一组内容传递给方法。该方法应该对每件事做点什么。
在将集合传递给方法之前,必须创建它。要创建一组东西,您需要一个具有Add方法的类。列表类可以。
对于接收方法,将内容添加到集合的功能是无关紧要的。它只需要能够枚举集合中的东西。所以你传递了IEnumerable,而不是List。
通常,将实例分配给基本类型变量可以消除噪音并缩小做出假设的空间。它说“在这一点上,子类型并不重要,所以这并不比基本类型复杂。”这简化了思想。