Я хочу создать класс, который не реализует какой-либо метод интерфейса, но расширяет любую реализацию A своими собственными методами.Создание класса реализации, который повторно использует объекты других реализаций одного и того же интерфейса
Давайте предположим, что мы имеем следующее:
public interface A {
public void a();
}
и
public class B implements A {
@override
public void a() {
System.out.println("a");
}
}
Теперь я хочу, чтобы создать класс C
, который также implements A
и принимает другую случайную реализацию A
:
public class C implements A {
public C(A a) {
//what do I need to do with a here?
}
public void c() {
System.out.println("c");
}
}
Теперь, если у меня есть foll :
A b = new B();
A c = new C(b);
c.a();
Выход должен быть «а».
Я не могу просто
public class C extends B {
...
, как C, как предполагается, чтобы иметь возможность работать с любой реализацией A, а не только В.
Я также не могу
public class C implements A {
private a;
public C(A a) {
this.a = a;
}
@override
public void a() {
a.a();
}
public void c() {
System.out.println("c");
}
}
, поскольку это означало бы, что я должен перенаправить каждый метод интерфейса и переписать C всякий раз, когда что-то меняется с A.
Есть ли способ справиться с этой проблемой в Java?
В качестве другого примера замените A: List; B: ArrayList; C: FooList; a(): size()
«поскольку это означало бы, что я должен перенаправить каждый метод интерфейса и переписать C всякий раз, когда что-то меняется с помощью A» - хорошо, если A изменяется, вы * имеете *, чтобы изменить каждую реализацию A. Это так, как есть. –
Возможно ли для вас создать абстрактный класс вместо интерфейса? – Manish
@ Мишень нет, см. Мой пример списка. Давайте просто подумаем, что мне нужен метод .count(), который возвращает .size() + 1. Проблема заключается в том, что ArrayList, например, не работал бы, если C ожидает AbstractFooList в качестве входного аргумента. – makrom