我有一个使用此方法的抽象类:
abstract class X {
abstract public function method( $param );
}
在实现中,我做到了:
class Y extends X {
public function method( ClassName1 $param )
{
...
}
}
class W extends X {
public function method( ClassName2 $param )
{
...
}
}
我需要将ClassName1
和ClassName2
放在两种方法中,但是出现此错误:
Y::method()
声明必须X::method($param)
符合...
我需要在 X 类中声明什么抽象方法来解决问题?真正的问题可能是:X::method( _____ $param )
用什么类名来解决问题?
谢谢。
您可以创建接口。 ClassName1
并ClassName2
实现该接口。现在,您可以将接口用作方法参数中的类型提示。根据您的标签polymorphism
,您可能知道如何使用接口,它们是什么以及它们有什么好处。此方法称为合同设计,被认为是最佳实践。
我不认为你会侥幸这样做,因为你的类型暗示了两个不同的类。当你使用abstract
或interface
时,它基本上是一个承诺,以与之前定义的方法相同的方式实现一个方法。您添加类型提示会使它们绝对不兼容。
我能建议的最好的事情是在方法本身内部进行检查
class Y extends X {
public function method( $param )
{
if(get_class($param) != 'ClassName1') throw new Exception('Expected class ClassName1');
}
}
我相信
独特的方式是这样的?
class A {}
class B extends A {}
class C extends A {}
abstract class X {
public abstract function method( A $param );
}
class Y {
public function method(B $param ) {}
}
class Z {
public function method(C $param ) {}
}
$y = new Y();
$z = new Z();
?>