Мы все знаем, почему 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 (..). Поэтому мне нужно спроектировать методы из классов транспорта и машин
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, который это делает?
- Есть ли где-нибудь предложение или план, который вам известен о такой структуре аннотаций?
Было бы также замечательно, если среда аннотаций / плагинов позволяет мне указывать, что boolean, int или что-либо еще должно быть преобразовано из String, и делает преобразование / синтаксический анализ для меня тоже.
Пожалуйста, посоветуйте кто-нибудь. Надеюсь, формулировка моего вопроса была достаточно ясной. Thx.
Отредактировано:
Чтобы OO-энтузиасты не спешили к выводу, я переименовал название этого вопроса.