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

标签 php oop inheritance abstract-class

Key 类有一个非抽象方法 getDescription()(用于多种用途)。

关键类由“子抽象类”(之一)扩展。

“子抽象类”由“具体类”扩展。

我想强制“一个具体类”实现 getDescription() 方法,并尝试在“子抽象类”中将其重新声明为抽象方法,但失败了。

那么,是否可以在 php 中将非抽象方法重新声明为抽象方法? 如果不是 - 如何强制实现具体方法?

关键类。我需要以这种方式声明的 getDescription 出于多种目的。

abstract class beverage{
public $description = "Unknown beverage";
public function getDescription(){return $this->description;}
};

抽象类,重写 getDescription() - 但不起作用。

abstract class condimentDecorator extends beverage {
    //public abstract function getDescription();
};

具体类,必须重新实现 getDescription。

class milk extends condimentDecorator{
public $beverage;
public function __construct(beverage $beverage){$this->beverage = $beverage;}
public function getDescription(){return $this->beverage->getDescription().", Milk";}
};

最佳答案

is it possible to redeclare non-abstract method as abstract in php?

不,您不能在 PHP 中执行此操作


您似乎正在尝试实现装饰器模式。
在这种情况下,提供的类链过于复杂。
装饰器模式致力于在不改变其结构的情况下向另一个类添加(扩展)功能。
以下是实现装饰器的经典且更优化的方法:

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

关于PHP。是否可以将非抽象方法重新声明为抽象方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41380570/

相关文章:

php - 通过 shell_exec() 创建的视频无法播放,但通过终端创建的视频可以

php - 如何比较 PHP 中的变量并根据结果更改 CSS

oop - OOP 中的 "Mutable class"是什么?

c++ - 基类成员初始化

java - 关于Java Reflection的几个问题

javascript - 对动态添加的组合框进行 Bootstrap 验证器验证

php - 如何使用 PHP 将 Google Analytics 客户端跟踪迁移到服务器端跟踪

java - 方法重载还是重写?

java - 在 Java 中存储对象集合的最佳方式?

c++ - 父类是子类不可访问的基础