Все мы знаем, почему в Java не должно быть множественного наследования. Так что это не вопрос о том, что уже обсуждалось до коровы.
Здесь обсуждается, что мы будем делать, если захотим создать класс, обладающий характеристиками двух или более других классов.
Вероятно, большинство из нас сделали бы это, чтобы «наследовать» от трех классов. Для простоты я пропустил конструктор.:
class Car
extends Vehicle
{
final public Transport transport;
final public Machine machine;
}
Таким образом, класс Car напрямую наследует методы и объекты класса Vehicle, но должен явно ссылаться на транспорт и машину, чтобы ссылаться на объекты, созданные в классах Transport и Machine.
Car car = new Car();
car.drive(); // from Vehicle
car.transport.isAmphibious(); // from Transport
car.machine.getCO2Footprint(); // from Machine
Я думал, что это хорошая идея, пока не столкнулся с фреймворками, требующими методов установки и получения. Например, XML
<Car amphibious='false' footPrint='1000' model='Fordstatic999'/>
будет искать методы setAmphibious(..), setFootPrint(..) и setModel(..). Поэтому мне приходится проецировать методы из классов Transport и Machine
class Car
extends Vehicle
{
final public Transport transport;
final public Machine machine;
public void setAmphibious(boolean b){
this.transport.setAmphibious(b);
}
public void setFootPrint(String fp){
this.machine.setFootPrint(fp);
}
}
Это нормально, если бы было всего несколько характеристик. Прямо сейчас я пытаюсь адаптировать весь SmartGWT в GWT UIBinder, особенно те классы, которые не являются виджетами GWT. Есть много характеристик для проекта.
Было бы неплохо, если бы существовала какая-то форма структуры аннотаций, подобная этой:
class Car
extends Vehicle
@projects {Transport @projects{Machine @projects Guzzler}}
{
/* No need to explicitly instantiate Transport, Machine or Guzzler */
....
}
Там, где, в случае существования общих имен характеристик, характеристики Машины будут иметь приоритет над Обжорами, а Транспорт будет иметь приоритет над Машинами, а Транспортные средства будут иметь приоритет над Транспортными. Затем инфраструктура аннотаций создаст экземпляры Transport, Machine и Guzzler как скрытые элементы Car и расширится, чтобы разбить защищенные/общедоступные характеристики в соответствии с приоритетом, определяемым последовательностью аннотаций @project, в фактический исходный код или в байт-код. Желательно в байт-код. Так что метод setFootPrint можно найти как в Machine, так и в Guzzler, будет проецироваться только метод Machine.
Вопросы:
- Вам не кажется хорошей идеей иметь такую структуру?
- Такая структура уже существует? Подскажите где/что.
- Есть ли плагин eclipse, который это делает?
- Есть ли где-нибудь предложение или план, который вы знаете о такой структуре аннотаций?
Также было бы замечательно, если бы структура аннотаций/плагинов позволяла мне указать, что логическое значение, целое число или что-то еще нужно преобразовать из строки, и также выполняла преобразование/анализ для меня.
Посоветуйте, кто-нибудь. Надеюсь, формулировка моего вопроса была достаточно ясной. Спасибо.
Отредактировано: чтобы энтузиасты ОО не делали поспешных выводов, я переименовал название этого вопроса.