Укажите супертип класса при создании / объявлении? - PullRequest
0 голосов
/ 04 января 2010

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

MonitoredDevice<DeviceTypeToExtend> device = null;

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

Спасибо

Steve

Ответы [ 3 ]

3 голосов
/ 04 января 2010

Наследование переоценено , используйте вместо него композицию (она более мощная и гибкая):

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

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

new MonitoredDeviceDecorator(new BaseDevice());
1 голос
/ 04 января 2010

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

0 голосов
/ 04 января 2010

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

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

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

public interface MonitoredDevice<E> {

  E computeFoo();

  void doBar();

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...