我想知道如何强制子类来实现给定的接口方法。
假设我有以下课程:
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”接口实现方法?
感谢您花时间阅读。
答案 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}}