Конечно, вы не можете преодолеть ограничения JVM через AspectJ и заставить ASupport
расширять как BSupport
, так и CSupport
.Каждый класс должен иметь один суперкласс (или ни одного, в этом случае он неявно наследуется от Object
).Также вариант declare parents : CSupport extends ASupport;
не будет работать, потому что он приведет к круговой иерархии, которая, конечно, запрещена, потому что это не имеет логического смысла.
Вы также, похоже, неправильно понимаете, как работает шаблон делегатора:
- не работает через наследование и
super()
вызовы, но - с помощью внутреннего члена, указывающего на делегата (если есть, первого члена в цепочкеКонечно, у нас нет делегата.
Давайте просто взглянем на два класса, которые вы упомянули в своем вопросе, не так ли?
package javax.xml.stream.util;
// (...)
public class StreamReaderDelegate implements XMLStreamReader {
private XMLStreamReader reader;
/**
* Construct an empty filter with no parent.
*/
public StreamReaderDelegate(){}
/**
* Construct an filter with the specified parent.
* @param reader the parent
*/
public StreamReaderDelegate(XMLStreamReader reader) {
this.reader = reader;
}
// (...)
}
package org.xml.sax.helpers;
// (...)
public class XMLFilterImpl
implements XMLFilter, EntityResolver, DTDHandler, ContentHandler, ErrorHandler
{
private XMLReader parent = null;
/**
* Construct an empty XML filter, with no parent.
* (...)
*/
public XMLFilterImpl() {
super();
}
/**
* Construct an XML filter with the specified parent.
* (...)
*/
public XMLFilterImpl(XMLReader parent) {
super();
setParent(parent);
}
/**
* Set the parent reader.
* (...)
*/
public void setParent(XMLReader parent) {
this.parent = parent;
}
// (...)
}
Видеть?В обоих случаях нет наследования, кроме делегирования.Вызовы super()
не связаны с шаблоном делегирования, они просто гарантируют, что конструктор суперкласса вызывается так, как и должно быть.Здесь у нас есть просто гибкий список объектов, каждый из которых указывает на своего делегата, похожий на связанный список.Это гораздо более гибкий подход, чем ваша идея привести все к фиксированному набору классов.
IMO, ваш подход пытается решить проблему, которая на самом деле не существует.Это пример проблемы XY .Не стесняйтесь задавать дополнительные вопросы, если я могу помочь вам в этом.Скажи мне что ты хочешь достичь, а не как ты считаешь, что это должно быть сделано.