Концепция, о которой я думаю, исходит от оспоримый интерфейс. Этот интерфейс не может быть непосредственно реализован, но вместо этого удовлетворяется путем реализации интерфейса, расширяющего его.
Могу ли я объявить интерфейс, который не может быть реализован, и вместо этого расширить с помощью открытых интерфейсов?
Редактировать: Я понимаю, что такая возможность будет довольно бессмысленной, так как она может быть обойдена третьей стороной, создающей интерфейс, который может расширить базовый интерфейс. Я ищу более чистый способ выразить полиморфизм.
Например:
abstract interface Vehicle
{
}
interface Car extends Vehicle
{
public function drive(RouteProvider $routeProvider, $speed)
}
interface Boat extends Vehicle
{
public function sail(BodyOfWater $water, $heading);
}
class PeopleMover
{
public function move(Vehicle $vehicle)
{
if ($vehicle instanceof Boat) {
// move people across bodies of water
} elseif ($vehicle instanceof Car) {
// move people along roads
}
}
}
Цель интерфейса — определить, как приложение обращается к вашему объекту, а не контролировать, как объекты определяются. Это способ для вашего объекта заявить приложению: «Я реализую этот интерфейс, так что вы можете верить, что у меня есть эти методы».
Если вы хотите контролировать, как определяются объекты, вы должны использовать абстрактные классы с абстрактными методами.
Других решений пока нет …