【问题标题】:In Polymorphism only derived class can be the base class, what happens here?在多态中,只有派生类可以是基类,这里会发生什么?
【发布时间】:2011-12-10 00:07:41
【问题描述】:

在多态中我了解到只有派生类才能成为基类,但是看看我的例子,基类现在是派生类:

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

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

class Person
{
}

class Customer : Person
{
}

为什么会这样?

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

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

【问题讨论】:

  • 只要对自己说:“Client IS A Person”,一切都应该清楚了:如果 Client 是 Person,您可以将其分配给 Person 对象。如果你知道这个特定的人是客户,你可以把它扔回去。

标签: c# .net oop polymorphism


【解决方案1】:

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

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

   //This will fail at runtime.
   Programmer c = (Programmer)a; 
} 

class Person 
{ 
} 

class Customer : Person 
{ 
} 

class Programmer: Person 
{ 
} 

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 在基类上实例化时,派生类的成员不应该被丢弃吗?如果我在基类中实例化派生类,分配的内存大小就是派生类的大小?
    • 这就是多态性的重点:BMW 和 Volkswagen 都是汽车。汽车 A = new BMW(), 汽车 B = new Volkswagen(); - 任何可以处理汽车的东西都可以处理宝马、大众或法拉利。它不需要关心。在 .NET 中,Volkswagen 或 BMW 的特性(变量)都在 Car 中,但只有将 Car 转换回 BMW/Volkswagen 才能访问它们。他们没有丢失。
    • 您没有在基类中实例化派生类。您实例化了一个派生类,并将该对象的地址放入基类变量中。内存大小等完全不受影响。
    • 您创建了一个客户端实例,因此使用的内存将是客户端所需的内存。然后你获取一个 Person 变量并让它指向你的 Client 对象。这不会改变客户端使用的内存量。
    • 当你说 Person a = new Client();发生了两件事 - 首先创建了一个 Client() 对象。在这个时间点,编译器并不关心这个对象将被放在哪里。它只是创建一个客户端对象。在第二步中,编译器看到需要创建 a 变量。它创建此变量并将新创建的 Client 对象的“地址”放入变量中(在放入地址之前,它检查 Client 是否是 Person 的子类,如果不是,则给出异常)。所以你看到在这种情况下没有内存限制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-01
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    相关资源
    最近更新 更多