Domovoj
Guest
Реализация классом двух интерфейсов с пересекающимся набором методов
Столкнулся со следующей проблеммой в PHP 5.0.2:
Это не работает, пишет, что нельзя наследовать B::a(), так как таккая функция уже была наследованна от A
?!
С каких пор интерфейсы наследуются? Это баг PHP или я чего-то не понимаю?
Я думал, что интерфейсы лишь определяют имена методов, которые класс, реализующий интерфейсы, должен определить. Почему класс не может реализовывать два разных интерфейса с пересекащимися методами?
Изначально пытался сделать следующее:
Это не работало (таким образом, наследуя интерфейс, нельзя "переопределить" уже указанный метод).
Попробовал способ, описанный в начале. Не работало.
Попробовал даже так:
Опять таже ошибка про наследование абстрактной функции, уже унаследованной от интерфейса!
Вопрос:
Есть ли объективные причины для описанного выше поведения PHP? Я имею в виду не особенности реализации PHP, а ООП в целом. Насколько я помню, в Jave такого ограничения вроде бы нет.
Пришлось делать так:
Столкнулся со следующей проблеммой в PHP 5.0.2:
PHP:
interface A {
// делаем A
public function a();
}
interface B {
// делаем A, нужно для того-то
public function a();
// делаем B
public function b();
}
class C implements A, B {
public function a() {};
public function b() {};
}
?!
С каких пор интерфейсы наследуются? Это баг PHP или я чего-то не понимаю?
Я думал, что интерфейсы лишь определяют имена методов, которые класс, реализующий интерфейсы, должен определить. Почему класс не может реализовывать два разных интерфейса с пересекащимися методами?
Изначально пытался сделать следующее:
PHP:
interface A {
// делаем A
public function a();
}
interface B extends A {
// делаем A, нужно для того-то
public function a();
// делаем B
public function b();
}
class C implements B {
public function a() {};
public function b() {};
}
Попробовал способ, описанный в начале. Не работало.
Попробовал даже так:
PHP:
interface A {
// делаем A
public function a();
}
abstract class B implements A {
// делаем A, нужно для того-то
abstract public function a();
// делаем B
abstract public function b();
}
class C extends B {
public function a() {};
public function b() {};
}
Вопрос:
Есть ли объективные причины для описанного выше поведения PHP? Я имею в виду не особенности реализации PHP, а ООП в целом. Насколько я помню, в Jave такого ограничения вроде бы нет.
Пришлось делать так:
PHP:
interface A {
// делаем A
public function a();
}
abstract class B implements A {
// делаем A, нужно для того-то
public function a(){};
// делаем B
abstract public function b();
}
class C extends B {
public function a() {};
public function b() {};
}