强迫某人让他的子类实现接口的方法

时间:2012-07-20 17:47:47

标签: php interface subclass

我想知道如何强制子类来实现给定的接口方法。

假设我有以下课程:

interface Serializable
{
    public function __toString();
}

abstract class Tag // Any HTML or XML tag or whatever like <div>, <p>, <chucknorris>, etc
{
    protected $attributes = array();

    public function __get($memberName)
    {
        return $this->attributes[$member];
    }

    public function __set($memberName, $value)
    {
        $this->attributes[$memberName] = $value;
    }

    public function __construct() { }

    public function __destruct() { }
}

我想强制“Tag”的任何子类来实现“Serializable”接口。例如,如果我是一个“段落”类,它会看起来像这样:

class Paragraph extends Tag implements View
{
    public function __toString()
    {
        print '<p';
        foreach($this->attributes as $attribute => $value)
            print ' '.$attribute.'="'.$value.'"';
        print '>';

        // Displaying children if any (not handled in this code sample).

        print '</p>';
    }
}

我如何强迫开发人员让他的“Paragraph”类从“Serializable”接口实现方法?

感谢您花时间阅读。

3 个答案:

答案 0 :(得分:6)

让抽象类实现接口:

interface RequiredInterface 
{
    public function getName();
}

abstract class BaseClass implements RequiredInterface 
{

}

class MyClass extends BaseClass
{

}

运行此代码将导致错误:

  

致命错误:类MyClass包含1个抽象方法且必须   因此,应宣布抽象或实施其余方法   (RequiredInterface ::的getName)

这要求开发人员对RequiredInterface

的方法进行编码

答案 1 :(得分:1)

PHP代码示例:

class Foo {
  public function sneeze() { echo 'achoooo'; }
}

abstract class Bar extends Foo {
  public abstract function hiccup();
}

class Baz extends Bar {
  public function hiccup() { echo 'hiccup!'; }
}

$baz = new Baz();
$baz->sneeze();
$baz->hiccup();

抽象类可以扩展Serializable,因为抽象类需要基础

答案 2 :(得分:0)

这会为__construct或您的班级Paragraph添加Serializable,以检查是否已实施class Paragraph extends Tag implements View { public function __construct(){ if(!class_implements('Serializable')){ throw new error; // set your error here.. } } public function __toString() { print '<p'; foreach($this->attributes as $attribute => $value) print ' '.$attribute.'="'.$value.'"'; print '>'; // Displaying children if any (not handled in this code sample). print '</p>'; } }

{{1}}