继承基类参考C#
class Base
{
//...
public int i = 5;
}
class Drifted : Base
{
//...
public int b = 10;
}
Base ObjectOrReference = new Drifted();
所以Base ObjectOrReference;
是引用基类型。 当我们写Base ObjectOrReference = new Drifted();
它成为对象,因为通过使用'新'我们为它分配内存?或者它仍然参考,如果它是真的,它有什么类型? 直接问题是:“是ObjectOrReference
对象?”继承基类参考C#
它仍然是一个引用,指向堆上的对象的指针。它是类型。
即使你的参考是Base
类型,底层对象是并在派生类任何重写的成员将被用来代替那些Base
,即使你试图使用Base
。
在使用new
语法的成员隐藏的情况下,如果您有对基本类型的引用,它将绕过隐藏成员的任何派生类。
可以通过谷歌搜索“C#参考类型”在线查找概述。我脱脂这一点,看起来像一个值得读:
为什么我可以为'ObjectOrReference.i'赋值如果'ObjectOrReferenc'不是对象,堆中的对象名称是什么。 – Nikita 2011-05-17 13:29:25
@Nikita,因为那是'Base'类型的成员。使用'ObjectOrReference'局部变量你看不到'Drifted.b',你需要转换为'Drifted'来看看。 – 2011-05-17 13:32:08
@Nikita C#隐藏了它实际上指向堆上的内存位置的事实。 C#引用会自动解析为对象,而在C++中则需要自己解析指针。 – 2011-05-17 13:34:12
Base ObjectOrReference = new Drifted();
用,你已经创建了一个实例,但由Base
参考变量ObjectOrReference
引用。目前它的功能仅限于Base
中提供的功能。如果你想要访问int b
在,你必须将它投到
它是永远是一个参考。将对象变量看作指针/引用。虽然实际的对象创建/分配发生在堆上,但引用是在本地堆栈空间上创建的。
是的,ObjectOrReference
是一个对象和一个有效的对象。
这是类型的一个对象。这是一个面向对象编程的基本概念,基类的指针/引用(你的案例中的ObjectOrReference
)可以持有/引用它的派生类的对象(在你的情况下为),这就是为什么它不是一个错误和一个有效的对象类型
您已经实例化派生类的对象,但通过其基本类引用类型(ObjectOrReference)引用其内存位置。对象引用仅知道其类型的成员(即在其基类中),并完全不知道其派生类的成员。 所以你不能访问派生类的成员,因为我们在谈论继承问题,所以你不能在这里输入cast
你能否重新说明你的问题? – 2011-05-17 13:28:34
基本上我被问到'ObjectOrReference'引用OR对象吗?据我了解,它同时引用和受限制的“Drifted”类的对象,我的意思是它只能访问'Base'中定义的成员。 – Nikita 2011-05-17 13:50:07