c# - 在多态中只有派生类可以是基类,这里发生了什么?

标签 c# .net oop polymorphism

在多态性中我了解到只有派生类可以是基类,但是看看我的例子,基类现在是派生类:

static void Main()
{
   Person a = new Customer();

   //here a base class is a derived class
   Customer c = (Customer)a;
}

class Person
{
}

class Customer : Person
{
}

为什么这是可能的?

派生类的成员在基类上实例化时不应该被丢弃?

如果我在基类中实例化派生类,分配的内存大小是派生类的大小?

最佳答案

因为 a 实际上是一个 Client 对象,所以这可以正常工作。让我更具体一点:
a 是 Person 类型的“变量”,它可以容纳从 Person 到它的任何子类的任何类型的“对象”。
c 是 Client 类型的“变量”,可以保存从 Client 到其任何子类的任何类型的“对象”。

您所做的是将 Client 的“对象”放入 Person 的“变量”中。无论您将此对象移动到何处,它始终是一个 Client 对象。所以,我们需要记住的是,即使你把一个Client的“对象”放到Person类型的“变量”中,这个对象类型仍然是client。在下一条语句中,您只是将对象移动到正确的类型中。

变量就像一个篮子。它可以容纳任何比它小的东西。如果你把那个东西从篮子里拿出来放到另一个篮子里,这个东西还是一样的。

关于c# - 在多态中只有派生类可以是基类,这里发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7806128/

相关文章:

Javascript 使用变量继承构造函数

c# - 我们如何在单击菜单条项目时突出显示事件菜单项?

c# - MonoTouch 从 subview 设置位置

c# - 如何在 C# 中创建一个将生成 HTTP 响应主体行的迭代器?

.net - 有人知道用于对SaaS用户进行计费和身份验证的服务吗?

java - 为什么 Execute Aroud 习语不被视为策略设计模式?

c# - 如何在 C# 中读取 ID3 标签并将其写入 MP3?

c# - 如何清除picturebox中的图形(矩形)

.net - 有没有一种简单的方法来解码 PEVerify 错误和警告?

ios - 如何扩展 UITextView 类?