4

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

假设我有以下课程:

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”接口。例如,如果 ia "Paragraph" 类,它看起来是这样的:

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>';
    }
}

我如何强制开发人员让他的“段落”类实现接口“Serializable”中的方法?

感谢您花时间阅读。

4

3 回答 3

6

只需让抽象类实现接口:

interface RequiredInterface 
{
    public function getName();
}

abstract class BaseClass implements RequiredInterface 
{

}

class MyClass extends BaseClass
{

}

运行此代码将导致错误:

致命错误:MyClass 类包含 1 个抽象方法,因此必须声明为抽象方法或实现其余方法 (RequiredInterface::getName)

这需要开发人员编写RequiredInterface.

于 2012-07-20T17:57:09.483 回答
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,因为抽象类不需要

于 2012-07-20T17:53:30.977 回答
0

这会__construct在您的类中添加一个 or 来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>';
  }
}
于 2012-07-20T17:53:56.750 回答