2010-01-04 3 views
0

Можно ли указать родительский элемент класса при создании/объявлении этого класса? Например, я могу сделать что-то похожее на это:Укажите супертип класса при создании/декларировании?

MonitoredDevice<DeviceTypeToExtend> device = null; 

А потом из этого заявления, класс MonitoredDevice будет простираться от параметра типа DeviceTypeToExtend. Теперь я знаю, что вы не можете использовать параметры типа для расширения от суперкласса, но кто-нибудь знает что-то подобное, чтобы достичь этой цели, «динамически», простираясь от конкретного родителя.

Спасибо,

Стив

ответ

3

Наследование завышен, использование композиции вместо (это более мощный и гибкий):

MonitoredDevice monitored = new MonitoredDevice(); 
monitor.setTargetDevice(new BaseDevice()); 

или шаблон декоратора:

new MonitoredDeviceDecorator(new BaseDevice()); 
1

Нет, вы не можете этого сделать потому что тогда класс MonitoredDevice должен был бы распространяться непосредственно из своего собственного параметра типа, что невозможно. Вместо этого вы могли бы иметь что-то вроде MonitoredDevice<T extends MonitoredDevice<T>>, как и для Enums, а затем для типа супертипа все еще будет информация о сыром типе.

+0

Джошуа Блох обсуждает такие * рекурсивные ограничения типа * в * Эффективная Java *, выдержки из: http://java.sun.com/docs/books/effective/generics.pdf – trashgod

0

У вас есть много вариантов. Это может помочь, если вы разместите интерфейсы для MonitoredDevice & DeviceTypeToExtend, чтобы мы могли лучше понять, чего вы надеетесь достичь.

обратная связь mhaller имеет смысл; вы, вероятно, не хотите делать все это с наследованием.

Одна возможность: использовать дженерики. Ваш интерфейс MonitoredDevice может выглядеть следующим образом:

public interface MonitoredDevice<E> { 

    E computeFoo(); 

    void doBar(); 

} 

Вы также можете использовать композицию (вероятно, самый простой) или иерархия классов многоуровневый (не рекомендуется).

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