Я надеюсь, что вы просто просите что-то подобное.Например, я возьму шаблон decorator (но вы можете применить то же самое к другому).
class A implements Decorator{
@Override
public void decorate(){
System.out.print("Decorate A");
}
@Override
public void help(){
System.out.print("Help");
}
}
class B implements Decorator{
private Decorator member;
public B(Decorator decorator){
this.member = decorator;
}
@Override
public void decorate(){
member.decorate();
System.out.print("Decorate B");
}
@Override
public void help(){
//***you need the behaviour of A here
member.help();
}
}
Decorator d = new B(new A());
b.help();
Так что в строке // **, если вы хотите поведениетам просто сделайте B extends A
вместо расширения / реализации абстрактного класса / интерфейса.Тогда вам не нужно делегировать.Это поведение будет унаследовано.
Но в любом случае, если вы захотите выполнить метод member там, оставив его более универсальным и предоставив возможность среде выполнения принять решение, вам придется делегировать.Другого решения не существует, потому что эта логика инкапсулирована только внутри класса-члена, и вы не знаете точный тип, пока среда выполнения не внедрит фактический член.
Вы можете сослаться на этот пример, чтобы увидеть, как можно добиться этого делегирования шаблона декоратора с помощью lombok .
public class RemovalCountingList<E> implements List<E> {
@Delegate(excludes = ExcludedListMethods.class)
private final List<E> delegate;
private final AtomicInteger removalCount = new AtomicInteger();
public RemovalCountingList(List<E> delegate) {
this.delegate = delegate;
}
@Override
public E remove(int index) {
System.out.println("Removal count: " + removalCount.incrementAndGet());
return delegate.remove(index);
}
@Override
public boolean remove(Object o) {
boolean isRemoved = delegate.remove(o);
if (isRemoved) {
System.out.println("Removal count: " + removalCount.incrementAndGet());
}
return isRemoved;
}
/**
* Excluded methods that Lombok will not implement, we will implement/override these methods.
*/
private abstract class ExcludedListMethods {
public abstract E remove(int index);
public abstract boolean remove(Object o);
}
}
public class ClientMain {
public static void main(String[] args) {
RemovalCountingList<String> cities = new RemovalCountingList<>(new ArrayList<>());
cities.add("London");
cities.add("Paris");
cities.add("Istanbul");
cities.add("Tokyo");
String removedCity = cities.remove(0);
System.out.println("Removed city: " + removedCity);
boolean isRemoved = cities.remove("Istanbul");
System.out.println("Is removed?: " + isRemoved);
}
}
Это поможет вамчтобы удалить ваши стандартные коды.