如何将类名类型添加到抽象方法的参数中


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();
?>