如何实例化基类,然后将其转换为派生类?

时间:2010-03-23 18:34:22

标签: c# polymorphism casting

我想知道如何做到这一点,请考虑以下类

public class Fruit
{
    public string Name { get; set; }
    public Color Color { get; set; }
}
public class Apple : Fruit
{
    public Apple()
    {

    }
}

我如何实例化一个新的水果,但向苹果转发,有没有办法实例化一堆水果,并使他们的苹果与名称&颜色设置。我需要手动深层复制吗?

当然这会失败

Fruit a = new Fruit();
a.Name = "FirstApple";
a.Color = Color.Red;
Apple wa = a as Apple;
System.Diagnostics.Debug.Print("Apple name: " + wa.Name);

我是否需要将Fruit传递给AppleCTor并手动设置名称和颜色(或1-n属性)是否有更好的设计来执行此操作?

4 个答案:

答案 0 :(得分:6)

默认情况下,a实例是Fruit的实例,不能转换为Apple。它是一个Apple实例,永远不会。

但是,您可以实施explicit cast

答案 1 :(得分:5)

在您的模型中,Fruit不是Apple - 如果您需要Apple,请将其实例化。或者,如果您要创建Apple使用Fruit作为起点,为Apple创建一个可以接受Fruit的构造函数。

您应该注意,继承层次结构中的中间类可实例化(非抽象)的对象模型通常是个坏主意。在某些情况下,这种等级可能是合适的 - 但我发现一般来说,它们比它们的价值更麻烦。认真考虑Fruit Apple是否需要具体且可实例化。

答案 2 :(得分:4)

看起来您正试图想出一种方法来实例化从公共基类派生的许多可能对象中的一个。通常,这是通过抽象工厂模式完成的。有关更多详细信息和实施示例,请参阅:http://en.wikipedia.org/wiki/Abstract_factory_pattern

答案 3 :(得分:2)

如果您创建了Fruit,那么它不是Apple。你无法向上转播它,因为它可能不具备它所需要的所有属性。如果你想要Apple,请创建一个Apple。你不需要传递任何东西。

我怀疑以下内容可行:

Fruit a = new Apple();
System.Diagnostics.Debug.Print("Apple name: " + a.Name);

...但我不是Java程序员。这基本上就是你在C ++中所做的。 (请务必阅读另一个答案中给出的Abstract Factory Pattern链接,特别是如果您需要实例化一堆不同的Fruit子类型。)