У меня есть объекты и репозитории в моем проекте. Для упрощения, яPHP Наследование интерфейсов и аргументов
EntityInterface
UserEntity
BusinessEntity
Интерфейс:
interface Entity
{
/**
* @return EntityId
*/
public function getId();
}
Реализации
class UserEntity implements Entity
{
/**
* @return EntityId
*/
public function getId(){
//...do something here for return
return $userId;
}
}
и
class BusinessEntity implements Entity
{
/**
* @return EntityId
*/
public function getId(){
//...do something here for return
return $userId;
}
}
Я хотел бы определить Repository бейс-функциональность, как save
, так что мой интерфейс выглядит следующим образом:
interface Repository
{
/**
* @param Entity $entity
*
* @throws \InvalidArgumentException If argument is not match for the repository.
* @throws UnableToSaveException If repository can't save the Entity.
*
* @return Entity The saved entity
*/
public function save(Entity $entity);
}
Позже, у меня есть различные интерфейсы для различных тип репозиториев, таких как UserRepository
и BusinessRepository
interface BusinessRepository extends Repository
{
/**
* @param BusinessEntity $entity
*
* @throws \InvalidArgumentException If argument is not match for the repository.
* @throws UnableToSaveException If repository can't save the Entity.
*
* @return Entity The saved entity
*/
public function save(BusinessEntity $entity);
}
Приведенный выше код не удается, потому что Declaration must be compatible with Repository...
однако BusinessEntity реализует Entity, поэтому он совместим.
У меня есть много типов сущностей, поэтому, если я не могу набрать подсказку, мне всегда нужно проверить, что переданный экземпляр является экземпляром того, что мне нужно. Это глупо.
Следующий код не раз:
class BusinessRepository implements Repository
{
public function save(BusinessEntity $entity)
{
//this will fail, however BusinessEntity is an Entity
}
}
Тем не менее смущен, потому что в SOLID, принцип замещения Лиск говорит > если S является подтипом T, тогда объекты типа T могут быть заменены на объекты типа S это точно то же самое, что я хочу сделать Вот. BusinessEntity является Entity, реализует Entity, я ожидаю Entity, и если BusinessEntity реализует Entity, почему я не могу использовать BusinessEntity как Entity ... – fureszpeter