Тип класса, который реализует несколько интерфейсов - PullRequest
9 голосов
/ 22 июня 2011

В настоящее время я пытаюсь написать некоторые классы и сталкиваюсь со следующей проблемой:

Я пытаюсь написать класс, который реализует некоторые функции из двух интерфейсов

interface IA {
 public void doSomething();
}

interface IB {
 public void doSomethingToo();
}

И у меня есть два класса, реализующих эти интерфейсы:

class FooA implements IA, IB{

}

class FooB implements IA, IB{

}

Есть ли способ, которым я могу сделать это:

public <type> thisClassImGonnaUse = returnEitherFooAOrFooB();
thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();

Ответы [ 4 ]

9 голосов
/ 22 июня 2011

Создайте новый интерфейс

public interface IAandB extends IA, IB 

и заставьте FooA и FooB реализовать его.

1 голос
/ 22 июня 2011

Это может быть не совсем то, что вы хотите, но вы можете создать третий интерфейс, который расширяет их оба:

interface IAandB extends A, B {}

Тогда FooA и FooB будут реализовывать IAandB вместо IA и IB напрямую:

class FooA implements IAandB{}
class FooB implements IAandB{}

Тогда вы можете объявить thisClassImGonnaUse типа IAandB:

public IAandB thisClassImGonnaUse = returnEitherFooAorFooB();
thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();
1 голос
/ 22 июня 2011

вы можете создать абстрактный базовый класс или другой интерфейс, который расширяет как IA, так и IB

abstract class Base implements IA, IB{}

и

class FooA extends Base implements IA, IB{...}
0 голосов
/ 22 июня 2011

Если существует вероятность того, что класс реализует IA и IB, и этот факт концептуально имеет смысл для проблемной области, в которой вы работаете, просто имейте IAB какthis

interface IAB extends IA, IB { /* nothing */ }

Определите , если это имеет смысл в вашем случае, может быть так же просто, как спросить себя , что будет хорошим именем для IAB? Если вы можетепридумать удовлетворительный ответ на это, вы можете просто добавить этот интерфейс.Если не , тогда правильное место для ваших двух

thisClassImGonnaUse.doSomething();
thisClassImGonnaUse.doSomethingToo();

линий будет метод FooA или FooB (или базовый класс этих двух).Таким образом, вам не нужно делать заблуждения или предположения о природе классов, реализующих ваши интерфейсы (которые могут стать недействительными или затруднительными для обработки позже).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...