考虑到这种情况,我有一个抽象类,子类采用一个蓝图并对其执行不同的操作。现在,我有多个类可以对此进行扩展,并对蓝图执行略有不同的操作,因此,我可以扩展上述蓝图的版本,我需要每个子类都可以获取。
因此,我想将抽象类中的属性或相应函数输入属性定义为/类型,将其定义为any,然后在每个子类中指定属性类型。
但是我不能这样做,因为PHP 7给我一个错误
Declaration B::setBlueprint() must be compatible with A::setBlueprint()
蓝图类
class Blueprint {
public $id;
}
class ChildBlueprint extends ParentBlueprint {
public $someOtherPropINeedOnlyInThisClass;
}
以及使用这些蓝图的抽象类
abstract class A {
abstract public function setBlueprint( ParentBlueprint $_ );
}
class B extends A {
public function setBlueprint( ChildBlueprint $_ ) {}
}
我的意思是我需要一个从所有A,B,C,...,X,Y类中派生的蓝图,因此将其排除在抽象类之外是没有意义的。
有什么好的OOP解决方案?
答案 0 :(得分:1)
您可以通过实现依赖反转来克服这一点:
interface Blueprint {
}
class ParentBluePrint implements Blueprint
{
public $id;
}
class ChildBluePrint extends ParentBlueprint
{
public $id;
}
abstract class A
{
abstract public function setBlueprint( Blueprint $_ );
}
class B extends A
{
public function setBlueprint( Blueprint $_ ) {}
}
详细了解相关的SOLID原则here。