[英]How to add classname type to the parameter of abstract method?
我有一個抽象類與此方法:
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();
?>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.