Я не думаю, что приведенные выше ответы хороши с точки зрения дизайна. Когда вы создаете интерфейс, вы хотите убедиться, что вызывающий объект несет ответственность за некоторые действия, определенные в этом интерфейсе. Итак, есть два решения, обсуждаемые выше, и я расскажу, почему эти решения не хороши с точки зрения дизайна.
1. make one interface расширяет оба интерфейса:
public interface IC extends IA,IB {
// empty method here
}
Выше код не имеет смысла. Вы определяете отдельный интерфейс только для объединения других интерфейсов, и внутри нет никаких новых методов. Вы не добавляете значение к IC
вместо объединения двух интерфейсов IA
и IB
. И в некоторых ситуациях этот код сделает ваш код «немного веселым», когда вы не можете найти подходящее имя для третьего интерфейса. Эта ситуация приведет к некоторому имени интерфейса, например IReadableAndWriteable
или ISomethingAndSomethingAndAnotherThing
2. метод литья внутри метода:
public void methodA(IA object) {
if (object instance of IB) {
((IB)(object)).someMethod()
}
Этот способ тоже глупость. Почему входной параметр IA
, то вы должны выполнить какое-то действие из интерфейса IB
? С точки зрения программиста, нет способа узнать это, кроме чтения вашего документа. Это не хорошо для разработки функции для использования другими людьми.
Истинное решение:
Выше решений есть еще одна проблема в дизайне: вы заставляете программиста использовать один объект, который отвечает за два интерфейса. В чем проблема, если программист не хочет этого делать. Они хотят использовать два разных бетонированных класса для каждого интерфейса для упрощения тестирования, чистого кода? Они не могут.
Вы должны сделать два разных параметра в сигнатуре вашего метода:
public void exampleMethod(IA object1, IB object2) {
object1.someMethod()
object2.someMethod()
}
И для вызова вышеуказанного метода вы помещаете один и тот же параметр внутрь (если программист использует один и тот же объект). Они также могут помещать разные предметы.
public void caller() {
IC object3 = new C(); // C is the class implements both IA and IB
exampleMethod(object3, object3);
IA objectA = new A();
IB objectB = new B();
exampleMethod(objectA, objectB);
}
Надеюсь, эта помощь:)