簡體   English   中英

如何在抽象方法的參數中添加類名類型?

[英]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 )
   {
       ...
   }
}

我需要將ClassName1ClassName2放在這兩種方法中,但出現此錯誤:

Y::method()必須與...中的X::method($param)兼容

我需要在X類中聲明抽象方法來解決此問題? 真正的問題可能是:解決問題的X::method( _____ $param )的類名是什么?

謝謝。

您可以創建一個界面。 ClassName1ClassName2實現該接口。 現在,您可以在方法參數中將接口用作類型提示。 基於標簽的polymorphism ,您可能知道如何使用接口,它們是什么以及有什么好處。 這種方法稱為按合同設計 ,被認為是最佳實踐。

我認為您不會因為這樣做而暗示了兩個不同的類。 當您使用abstractinterface ,從本質上講就是以與先前定義的方法相同的方式實現方法的承諾。 您添加的類型提示使其絕對不兼容。

我建議的最好的事情是在方法本身內部進行檢查

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM