让我们从理论开始。
假设我们有以下课程:
class A{}
class B : A{}
class C : B{}
接下来,我们做UpCast:
A a1 = new C();
以下陈述是否成立:对象a1是类型 C 的对象,并且它的基类是类型A(即在层次结构中向上)!?
远离结帐,想象一下将以下内容添加到您的代码中:
class A
{
public virtual void Method()
{
Console.WriteLine("Method A invoked");
}
}
class B : A
{
public new virtual void Method()
{
Console.WriteLine("Method B invoked");
}
}
class C : B
{
public override void Method()
{
Console.WriteLine("Method C invoked");
}
}
会显示什么?
首先,这里似乎一切都很明显,输出将是:
Method A invoked
Method A invoked
Method С invoked
Method C invoked
但实际上,我们得到: Method A invoked Method A invoked Method A invoked Method C invoked
根据这个逻辑,事实证明我之前的说法是不正确的,这意味着C的基类仍然是B?
现在让我们继续讨论问题的另一部分。
例如,我们有这样的代码:
class Program
{
static void Main(string[] args)
{
//объект типа класса А
A a = new A();
//объект типа класса B
B b = new B();
//UpCast, который равен объекту "b"
A a1 = b;
//UpCast как отдельный объект
A a2 = new B();
//DownCast, который равен объекту "а1"
B b1 = (B)a1;
B b2 = a as B; // вернет Null, т.к. DownCast
//без предварительного UpCast не возможен
// B b2 = new A(); - невозможно из за безопасности типов
//сравниваем b с а1,видим что типы идентичны.
Console.WriteLine(b.GetType() == a1.GetType());
//сравниваем а2 с а1,видим что типы идентичны.
Console.WriteLine(a2.GetType() == a1.GetType());
//сравниваем b1 и а1,видим что типы идентичны
Console.WriteLine(b1.GetType() == a1.GetType());
//Проверяем сами обьекты,вернет True
Console.WriteLine(a1.Equals(b));
//вернет False,но реализация этих объектов идентична
Console.WriteLine(a2.Equals(a1));
//Вернет True
Console.WriteLine(b1.Equals(a1));
Console.ReadKey();
}
}
class A
{
}
class B : A
{
}
那么幕后发生了什么?
与UpCast "e \ DownCast"一样,两个相同的对象(更准确地说,指向同一对象的两个引用)具有不同的实现(是的,是的 - 这就是多态性)。这是如何实现的(即 CLR 如何实现此行为模型)以及 Yudo 的所有这些奇迹在 CLR 本身中是什么样子的?在CLR中,类型之间的“继承”是什么样的?
