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

開発者に「Paragraph」クラスにインターフェース「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これにより、またはがクラスに追加され、実装され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 に答える