我有一个使用此方法的抽象类:
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()
声明必须与...... {/ p>中的X::method($param)
兼容
我需要在X类中声明抽象方法来解决问题吗?
真正的问题可能是:X::method( _____ $param )
中的类名是什么来解决问题?
感谢。
答案 0 :(得分:6)
您可以创建一个界面。 ClassName1
和ClassName2
实现该接口。现在,您可以将接口用作方法参数中的类型提示。根据您的标记polymorphism
,您可能知道如何使用界面,它们是什么以及它们带来的好处。这种方法称为 按合同设计 ,被认为是最佳做法。
答案 1 :(得分:2)
我不认为你会这样做是因为你打算暗示两个不同的类别。当您使用abstract
或interface
时,它基本上是承诺以与之前定义的方法相同的方式实施方法。添加类型提示会使它们显然不兼容。
我能建议的最好的事情就是在方法本身内进行检查
class Y extends X {
public function method( $param )
{
if(get_class($param) != 'ClassName1') throw new Exception('Expected class ClassName1');
}
}
答案 2 :(得分:1)
我相信这种独特的方式是这样的吗?
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();
?>