2014-12-23 2 views
2

Учитывая следующие классы, я решаю, как создавать дочерние классы на основе инструкции if/else, является ли это правильным подходом? Кроме того, правильно ли объявлять метод, возвращающий родительский элемент и возвращающий его потомку? (см. someMethod). Это не кажется правильным, есть ли лучший способ сделать это?Возвращение Java-ребенка в метод

public class Parent { 

    int someInt; 
} 

public class Child1 extends Parent { 

    int id1; 
    String field1; 
} 

public class Child2 extends Parent { 

    int id2; 
    String field2; 
} 

Классы используются следующим образом:

public class SomeClass { 

    public Parent someMethod(int option) { 

     Parent object = null; 
     if (option == 1) { 
      object = new Child1(); 
      // set Child1 fields 
      return object; 
     } 
     else { 
      object = new Child2(); 
      // set Child2 fields 
      return object; 
     } 

    } 


} 

ответ

1

это правильно объявить метод, который возвращает родительский, а затем вернуть ребенка?

Да, Parent будет правильным типом возврата для этого метода. И код выглядит нормально.

Несколько незначительных замечаний:

  • Вы могли бы реализовать его как return option == 1 ? new Child1() : new Child2();
  • классов на самом деле нет «родитель/потомок» отношения. Думаю, является. (Не могли бы вы сказать, что ребенок является родителем?) Базовый класс (или суперкласс) против подкласса - лучшие термины imo.
+1

Ваши второстепенные «незначительные» замечания не являются незначительными вообще! Это корневая концепция наследования объектов. Поэтому очень важно понять это, чтобы играть с объектно-ориентированным программированием. – greydet

0

код выглядит нормально, как это, вы могли бы, возможно, думаете сделать Parent в abstract class или interface, если это лучше подходит в вашей ситуации. Но есть что-то в somemethod вы могли бы улучшить, либо использовать тройной оператор в aioobe предложили или использовать переключатель-тематическое заявление, IMO они более читаемые:

public Parent somemethod (int option) 
{ 
    switch(option) 
    { 
    case 1: return Child1(); 
    default: return Child2(); 
    } 
} 
1

Да это совершенно правильно.

Это именно то, что завод шаблон проектирования выглядит следующим образом: http://en.wikipedia.org/wiki/Factory_method_pattern

+0

@aioobe, поскольку вы правы в отношении имени, я не согласен с обязательной статикой или частью родительского класса – user902383

+0

@aioobe Это выбор реализации. Вы правы, что многие реализации делают статические методы статичными, но IMO не является обязательным. Кроме того, класс Родитель обычно не является классом фабрики. Мы можем представить себе фабрику сложной гетерогенной иерархии классов с разными родительскими классами и общей внешней фабрикой. – greydet

0

Это правильный подход, и его можно рассматривать в качестве Factory рисунка

0

Вы можете хранить вспомогательный объект класса в супер эталонного класса переменной. Это называется повышением и отлично в java. И ваш код кажется идеальным.

Смежные вопросы