【问题标题】:How to make sure that class that implements interface should must define a property aswell如何确保实现接口的类也必须定义一个属性
【发布时间】:2018-07-09 11:47:18
【问题描述】:

我确实有一个名为 Jsonable 的接口。

interface Jsonabe{

public function toJson();

}

我确实有两个实现接口的类。

class facebookTransformer implements Jsonable{

  protected $facebookHandler;

  public function __construct(){

   $this->facebookHandler = new FacebookHandler();
  }
  public function toJson(){ 

  }

}

二等:

class googleTransformer implements Jsonable{

  protected $googleHandler;

  public function __construct(){

   $this->googleHandler = new GoogleHandler();
  }
  public function toJson(){ 

  }

}

现在有了实现的接口,我知道所有新类都将遵循该接口。我的问题是我可以以某种方式强制所有实现接口的类也定义属性并通过构造函数初始化它吗?或者我在接口中加一个构造函数可以吗?

我想确保所有其他类都具有$handler 属性。

【问题讨论】:

  • 如果你创建一个实现这个接口的抽象类然后使用它来扩展其他类,你可以拥有一个属性,但是如果你想要严格的接口,那么你没有任何解决方案,只是强制另一种方法应该得到它,但你也不能确定它会被正确实施
  • @Edwin 实际上我在考虑一个抽象类,它强制它拥有属性但属性仍然可以为空,它会在运行时崩溃
  • 不提供空构造函数并强制处理程序给它,那么你就没有这个问题

标签: php oop interface


【解决方案1】:

您可以在界面中添加另一个方法,而不是使用该属性:

public function getHandler() ;

在此方法中,该类将返回一个$handler,如果尚未完成,则创建它。

【讨论】:

    【解决方案2】:

    您可以改为使用抽象方法强制派生类实现。 $handler 可以声明为抽象类的属性,因此每个派生类都会继承它。

    abstract class Class1{
        protected $handler = "";
        abstract function toJson();
    }
    
    class Class2 extends Class1{
        public function toJson(){
            $this->handler = "a value";
            return $this->handler;
        }
    }
    
    $foo = new Class2();
    echo $foo->toJson();
    

    【讨论】:

    • 其实我在考虑一个抽象类,但它强制拥有属性,但属性仍然可以为空,它会在运行时崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-23
    • 2017-10-13
    • 2012-08-20
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多