2014-12-02 2 views
0

Давайте предположим, у меня есть такие классы:
ParentA, ChildA1, ChildA2 ... ChildAn
ParentB, ChildB1, ChildB2 ... ChildBn
Дублирование кода против литья типа vs?

Таким образом, каждый класс ChildAi расширяет ParentA, и каждый класс ChildBi расширяет ParentB класс.

В классе ChildAi Мне нужно работать с классом ChildBi. Например:

public class ChildAi extends ParentA{ 
    public ChildBi getChildB(...){ 
    ....some logic.... 
    return childBi; 
    } 
} 

Таким образом, проблема заключается в методе getChildB. Если я поставлю этот метод в ParentA, я могу вернуть только класс ParentB, и мне всегда придется делать кастинг. Если я положу этот метод в ChildAi, я всегда буду дублировать этот метод и, по крайней мере, немного его логику. Как я могу это решить? Можно ли решить такую ​​проблему без дженериков?

+0

Возможно, [generics] (http://docs.oracle.com/javase/tutorial/java/generics/) может вам помочь. – Maroun

+1

Что заставляет вас не использовать дженерики? –

+0

Ну, вы сами определили несколько решений: явное литье или «дублированный» код. Обратите внимание, что generics в Java основаны на неявной кастинге в любом случае. –

ответ

1

Я думаю, что дженерики - ваш друг здесь.

Определение класса ParentA в folloiwing:

public class ParentA<T extends { 
    public abstract T getB(); 
} 

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

public class ChildA1 extends ParentA<ChildB1> { 
    public ChildB1 getB() { return ...;} 
} 

Вот и все. Без литья и дублирования кода.

+0

ОП запрашивает решение без использования дженериков. –

+0

@ E_net4, я не могу согласиться с тобой. OP ищет _solution_ и не имеет (или, по крайней мере, не предоставил) никакой причины против дженериков. Я думаю, что таких причин на самом деле не существует. Это решение в стиле Java. Другие решения, которые я могу себе представить, требуют кастинга. – AlexR

+0

Обратите внимание, что мне также интересно, почему OP не принимал использование дженериков. И отсутствие причин для этого не полностью аннулирует его первоначальный запрос. В этом случае ваш ответ должен был предусмотреть некоторую мотивацию или обоснование того, почему дженерики - единственный разумный способ пойти, в отличие от ответа, как будто та часть вопроса не существует. –

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