【问题标题】:How to add classname type to the parameter of abstract method?如何将类名类型添加到抽象方法的参数中?
【发布时间】:2016-08-20 06:23:04
【问题描述】:

我有一个使用这个方法的抽象类:

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 ) 中的类名是什么来解决问题?

谢谢。

【问题讨论】:

    标签: php html oop polymorphism extends


    【解决方案1】:

    您可以创建一个界面。 ClassName1ClassName2 实现该接口。现在你可以在你的方法参数中使用你的接口作为类型提示。根据您的标签polymorphism,您可能知道如何使用接口,它们是什么以及有什么好处。这种方法称为按合同设计,被认为是最佳实践。

    【讨论】:

    • 你能举个例子吗?
    【解决方案2】:

    我不认为你会这样做,因为你输入提示两个不同的类。当您使用abstractinterface 时,基本上是承诺以与之前定义相同的方式实现方法。您添加的类型提示使它们绝对不兼容。

    我可以建议的最好的事情是在方法本身内部进行检查

    class Y extends X {
       public function method( $param )
       {
           if(get_class($param) != 'ClassName1') throw new Exception('Expected class ClassName1');
       }
    }
    

    【讨论】:

    • 也许,在 Java 中我们可以像这样创建 X 类:public abstract class X<T> { public abstract void method( T param ); } public abstract class Y<ClassName1> { public void method( ClassName1 param ) { ... }}
    【解决方案3】:

    我相信独特的方式是这样的?

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

    【讨论】:

      猜你喜欢
      • 2016-06-28
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多