PHP。是否有可能将非抽象方法重新声明为抽象方法?

时间:2016-12-29 13:17:13

标签: php oop inheritance abstract-class

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();
};

2 个答案:

答案 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也是如此,你应该没有冲突。