开发者

How can I instantiate a base class and then convert it to a derived class?

开发者 https://www.devze.com 2022-12-24 15:10 出处:网络
I was wondering how to do this, consider the following classes public class Fruit { public string Name { get; set; }

I was wondering how to do this, consider the following classes

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

    }
}

How can I instantiate a new fruit but upcast to Apple, is there a way to instantiate a bunch of Fruit and make them apples with the name & color set. Do I need to manually deep copy?

Of course this fails

Fruit a = new Fruit();
a.Name = "FirstApple开发者_C百科";
a.Color = Color.Red;
Apple wa = a as Apple;
System.Diagnostics.Debug.Print("Apple name: " + wa.Name);

Do I need to pass in a Fruit to the AppleCTor and manually set the name and color( or 1-n properties) Is there an better design to do this?


By default, the a instance is an instance of Fruit and is not convertible to Apple. It's not an Apple instance, and will never be.

You can, however, implement an explicit cast.


In your model, a Fruit is not an Apple - if you want an Apple, instantiate one. Alternatively, if you want to create an Apple using a Fruit as a starting point, create a constructor for Apple that can accept a Fruit.

You should note, that object models where intermediate classes in the inheritance hierarchy are instantiable (not abstract) is often a bad idea. In some cases, such hierarchies may be appropriate - but I've found that in general they are more trouble than they are worth. Think really hard about whether both Fruit and Apple need to be concrete and instantiable.


It looks like you're trying to come up with a way to instantiate one of many possible objects derived from a common base class. Typically this is done through the Abstract Factory pattern. For more details and implementation examples see: http://en.wikipedia.org/wiki/Abstract_factory_pattern


If you create a Fruit, it isn't an Apple. You can't upcast it, because it probably won't have all of the attributes that it'll need. If you want an Apple, create an Apple. You don't need to pass anything to anything.

I suspect the following will work:

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

...but I'm not a Java programmer. That's basically what you'd do in C++ though. (Be sure to read the Abstract Factory Pattern link given in another answer, especially if you need to instantiate a bunch of different subtypes of Fruit.)

0

精彩评论

暂无评论...
验证码 换一张
取 消