Как я могу создать базовый класс и затем преобразовать его в производный класс? - PullRequest
4 голосов
/ 23 марта 2010

Мне было интересно, как это сделать, рассмотрим следующие классы

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

    }
}

Как я могу создать экземпляр нового фрукта, но приглушенный 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 ]

6 голосов
/ 23 марта 2010

По умолчанию экземпляр a является экземпляром Fruit и не может быть преобразован в Apple. Это не Apple экземпляр, и никогда не будет.

Однако вы можете реализовать явное приведение .

5 голосов
/ 23 марта 2010

В вашей модели Fruit не является Apple - если вы хотите Apple, создайте его экземпляр. В качестве альтернативы, если вы хотите создать Apple, используя Fruit в качестве отправной точки создайте конструктор для Apple, который может принимать Fruit.

Следует отметить, что объектные модели, в которых промежуточные классы в иерархии наследования являются инстанцируемыми (не абстрактными), часто являются плохой идеей. В некоторых случаях такие иерархии могут быть уместными - но я обнаружил, что в целом они приносят больше хлопот, чем стоят. Тщательно подумайте о том, должны ли Fruit и Apple быть конкретными и инстанцируемыми.

4 голосов
/ 23 марта 2010

Похоже, вы пытаетесь придумать способ создания одного из множества возможных объектов, полученных из общего базового класса. Обычно это делается с помощью шаблона Абстрактная фабрика. Для более подробной информации и примеров реализации см .: http://en.wikipedia.org/wiki/Abstract_factory_pattern

2 голосов
/ 23 марта 2010

Если вы создаете фрукт, это не яблоко. Вы не можете перевернуть его, потому что он, вероятно, не будет иметь всех необходимых атрибутов. Если вы хотите Apple, создайте Apple. Вам не нужно ничего передавать чему-либо.

Я подозреваю, что будет работать следующее:

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

... но я не программист на Java. Это в основном то, что вы делаете в C ++. (Обязательно прочитайте ссылку на абстрактный шаблон фабрики, приведенную в другом ответе, особенно если вам нужно создать несколько разных подтипов Fruit.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...