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



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

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。在下一个语句中,您只需将对象移动到正确的类型中。

变量就像一个篮子。它可以装下任何比它小的东西。如果您将对象从篮子中取出并将其放入另一个篮子中,该对象仍然保持不变。

虽然上面的方法有效(如其他答案所述),但下面的方法会失败,这可能是不尝试将基类强制转换为派生类的原因(除非您在运行时确实知道派生类的类型)。

static void Main() 
{ 
   Person a = new Customer(); 
   //This will fail at runtime.
   Programmer c = (Programmer)a; 
} 
class Person 
{ 
} 
class Customer : Person 
{ 
} 
class Programmer: Person 
{ 
} 

相关内容

  • 没有找到相关文章

最新更新