Обработка наследования с помощью родительского класса и дочерних классов с вложенными объектами

Предположим, у меня есть класс Child, расширяющий класс Parent. У класса Child есть два вложенных класса:nested1 иnested2. Я хочу, чтобы абстрактная функция была определена в Parent с аргументом как вложенным1 и возвращаемым типом как вложенным 2. Прямо сейчас, чтобы добиться этого, я создал функцию с аргументом и возвращаемым типом как объект.

Итак, теперь, когда я реализую дочерний класс, мне всегда требуется приводить объект к вложенным1 и вложенным2. Я чувствую, что был бы лучший способ добиться этого. Есть ли лучший способ уменьшить сложность?

Также прикреплен UML введите здесь описание изображения


person mc20    schedule 14.04.2016    source источник


Ответы (1)


Лучший способ с точки зрения типизации — создать интерфейсы внутри родительского класса, которые определяют вложенные классы в дочернем. Таким образом, вам не нужно будет приводить аргумент к func. Это не снижает сложность как таковую, но делает ваше намерение намного чище и уменьшает/устраняет необходимость приведения (всегда хорошо).

public abstract class Parent {

  interface Interface1 {
      //Specifications of methods that all child nested classes must have
  }

  interface Interface2 {
      //Specifications of methods that all child nested classes must have
  }

  public abstract Interface2 func(Interface1 obj);

}

public class Child extends Parent {

  private static class Impl1 implements Interface1 {
      //Implementations of methods in Interface1 as they pertain to Child
  }
  private static class Impl2 implements Interface2 {
      //Implementations of methods in Interface2 as they pertain to Child
  }


  @Override
  public Interface2 func(Interface1 obj) {
    //Should only have to use methods declared in Interface1
    //Thus should have no need to cast obj.

    //Will return an instance of Impl2
    return null;
  }
} 

В более широком плане вы должны спросить себя, почему каждому ребенку нужен свой собственный набор вложенных классов. Это станет намного проще, если вы сможете переместить определения вложенных классов в родительский (и сделать их статическими) и просто настроить дочерние классы по мере необходимости во время построения.

person Mshnik    schedule 14.04.2016
comment
Спасибо! . Определение вложенных классов отличается во всех дочерних элементах. Поэтому я не могу сделать их отдельными статическими классами. Можете ли вы придумать, как я могу еще улучшить дизайн? - person mc20; 14.04.2016
comment
Учитывая это, вопрос дизайна заключается в том, зачем вам вообще нужен абстрактный метод в родительском объекте? Скажем, у меня есть Parent p = ..., и я не знаю его типа, могу ли я вызвать p.func(...) с правильными аргументами? Если нет, то нет смысла использовать абстрактный метод. - person Mshnik; 14.04.2016