2016-12-29 2 views
2

Мой Parent класс как это:Как избежать отливку поля родителя в подклассах

public abstract class Parent{ 

    protected HashMap<String, Foo> field; 
    public abstract void method1(); 
} 

Теперь, двое детей Parent класса нужно перебирать HashMap, чтобы сделать что-то. Первому ребенку нужен класс Foo, поэтому проблем нет. Второго ребенка, хотя, имеет method1() реализован так:

@Override 
public void method1(){ 
    for(Foo i : this.field.values(){ 
    ((Bar) i).specificMethod(); 
    /* other code */ 
    } 
} 

с Bar, которая простирается Foo, конечно. Как вы можете видеть, литье является обязательным для использования конкретного метода класса Bar. Можно ли это избежать? Я знаю, что я мог бы использовать Generics в Parent классе, как это:

public abstract class Parent<T extends Foo>{ 

    protected HashMap<String, T> field; 
    /* etc. */ 
} 

, но я не знаю, если это считается плохим поведением.

+0

Объявление карты как «Карта '?, Если она содержит 'Bar' любыми способами. –

+3

Ваш общий подход, 'class Parent ', это нормально. В ответе Прашанта есть еще один вариант. Я сразу же предпочел бы дженерики, но вы можете лучше взвесить плюсы и минусы. –

ответ

2

Детский класс уже имеет глубокое знание содержимого карты. Кастинг, как вы упомянули, является уродливым и изворотливым подходом. Перемещение этого объявления в общую спецификацию класса делает его гораздо более очевидным и, вероятно, будет правильным путем.

1

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

i.execute()

, где выполнение является метод Foo, который будет переопределение подклассами. ... это приведет к тому, что нужно явно передать объект в тип подкласса.

+0

Благодарим вас за ответ, но это не тот случай. Метод «Бар» не должен присутствовать в классе Foo. Я буду держать ваше предложение на будущее, если я правильно понял ваш ответ. – LivingSilver94

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