Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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";
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?

like image 959
Eric Avatar asked Dec 03 '22 13:12

Eric


2 Answers

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.

like image 114
Mark Seemann Avatar answered Jun 02 '23 16:06

Mark Seemann


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.

like image 40
LBushkin Avatar answered Jun 02 '23 15:06

LBushkin