Key类有一个非抽象方法getDescription()(出于很多目的)。
密钥类由(一个)"一个子抽象类"。
扩展"儿童抽象课"由#34;一个具体的课程"延伸。
我想强制"一个具体的课程"实现getDescription()方法并尝试在"子抽象类"中重新声明它。作为一种抽象方法,但失败了。
那么,是否有可能将非抽象方法重新声明为php中的抽象? 如果不是 - 如何强制实施具体方法?
关键类。出于多种目的,我需要以这种方式声明getDescription。
unsubscribe
抽象类,覆盖getDescription() - 但不起作用。
abstract class beverage{
public $description = "Unknown beverage";
public function getDescription(){return $this->description;}
};
具体类,必须重新获得getDescription。
abstract class condimentDecorator extends beverage {
//public abstract function getDescription();
};
答案 0 :(得分:2)
是否可以在php中将非抽象方法重新声明为抽象?
不,你不能在 PHP
中做到这一点您似乎正在尝试实施 装饰器 模式。
在这种情况下,所呈现的类链过于复杂。
Decorator 模式专门用于向另一个类添加(扩展)功能而不改变其结构。
以下是实现装饰器的经典且更优化的方法: / p>
abstract class Beverage {
public $description = "Unknown beverage";
public function getDescription(){
return $this->description;
}
}
class CondimentDecorator extends Beverage {
protected $beverage;
public function __construct(Beverage $beverage) {
$this->beverage = $beverage;
}
public function getDescription() {
return "Description:\t" . $this->beverage->getDescription() . " with condiment";
}
};
class Milk extends Beverage {
public function __construct($desc = "") {
$this->description = $desc;
}
}
$milk = new Milk('Milk beverage');
$milk_with_condiment = new CondimentDecorator($milk);
echo $milk_with_condiment->getDescription();
输出:
Description: Milk beverage with condiment
答案 1 :(得分:0)
我认为主要问题是你如何实现这一点。
如果您已经有一个已经实现方法的课程,那么它的所有孩子都会默认实施该方法。
让我们说以下内容:
Class A {
public function niceFunction() {return "some awesome return with potato"; }
}
Class B extends A{
//it already has niceFunction
}
Class Avocado extends B {
// it also already has NiceFunction
}
所以你要做的是覆盖默认功能。
我认为你应该花点时间重新思考结构是否正确。
condimentDecorator不能成为界面吗?
Editd:
我的建议是做这样的事情:
Interface Descritible()
{
public function getDescription();
}
class beverage implements Descritible{
//do the stuff you need to do
// It must have getDescription() cuz it implements Descritible
}
abstract class A implements Descritible{}
class Avocado extends A {
//It'll not have a default implementation of getDescription
//so it'll have to implement it.
}
那么Class鳄梨将需要实现getDescription,因为Beverage也是如此,你应该没有冲突。