Философия Java

Конфликты имен при комбинировании интерфейсов


Вы можете столкнуться с небольшой ловушкой при реализации множественных интерфейсов. В предыдущем примере оба CanFight и ActionCharacter имели идентичные методы void fight( ). Но это не вызвало проблемы поскольку эти методы одинаковы в обоих классах, но что было бы если бы они были бы разными? Вот пример:

//: c08:InterfaceCollision.java

interface I1 { void f(); } interface I2 { int f(int i); } interface I3 { int f(); } class C { public int f() { return 1; } }

class C2 implements I1, I2 { public void f() {} public int f(int i) { return 1; } // перегружен

}

class C3 extends C implements I2 { public int f(int i) { return 1; } // перегружен

}

class C4 extends C implements I3 { // Одинаковы, нет проблем:

public int f() { return 1; } }

// Методы различаются только возвращаемым типом:

//! class C5 extends C implements I1 {}

//! interface I4 extends I1, I3 {} ///:~

Трудность здесь возникает как следствие нехорошего смешения переопределения, реализации и перегрузки, поскольку перегруженные функции могут отличаться только возвращаемым типом. Если раскомментировать последние две линии кода, то возникнет ошибка:

InterfaceCollision.java:23: f() in C cannot implement f() in I1; attempting to use incompatible return type found : int

required: void

InterfaceCollision.java:24: interfaces I3 and I1 are incompatible; both define f (), but with different return type

Использование одинаковых имен методов в разных интерфейсах предназначенных для комбинирования зачастую так же очень сильно понижает читабельность кода. Старайтесь избегать этого.



Содержание раздела