Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP。是否可以将非抽象方法重新声明为抽象方法?_Php_Oop_Inheritance_Abstract Class - Fatal编程技术网

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

PHP。是否可以将非抽象方法重新声明为抽象方法?,php,oop,inheritance,abstract-class,Php,Oop,Inheritance,Abstract Class,Key类有一个非抽象方法getDescription()(用于多种用途) 键类由“子抽象类”之一扩展 “子抽象类”由“具体类”扩展 我想强制“具体类”实现getDescription()方法,并尝试在“子抽象类”中将其重新声明为抽象方法,但失败了 那么,是否可以在php中将非抽象方法重新声明为抽象方法? 如果没有-如何强制实施具体方法 关键类。我需要以这种方式声明的getDescription用于许多目的 抽象类重写了getDescription()-但不起作用 具体类,必须重新实现getDes

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

键类由“子抽象类”之一扩展

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

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

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

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

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

具体类,必须重新实现getDescription


我认为主要的问题是你如何实施这个

如果您的类已经实现了一个方法,那么默认情况下,它的所有子类都将实现它

因此,假设您有以下几点:

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
}
因此,您要做的是覆盖默认函数

我认为你应该花点时间重新考虑一下结构是否正确

调味品装饰师不能是一个界面

编辑:


我的建议是这样做:

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.
}
因此,类avocado将需要实现getDescription,就像饮料一样,并且您应该没有冲突

是否可以在php中将非抽象方法重新声明为抽象方法

不,在PHP中不能这样做


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

输出:

Description:    Milk beverage with condiment

我们能看到一些代码吗?尽管如此,关键的问题仍然是:“在php中是否可以将具体方法重新声明为抽象?”然而,在java中,这种“具体到抽象”的重新声明是可能的。我曾想过使用接口,但没有尝试,但感觉这也会导致冲突。饮料类必须有具体的getDescription();使用与父类中相同的方法为子类定义接口听起来不太好。抽象问题(即从具体到抽象的重新定义)仍然存在。我的建议是这样做:
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
}
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.
}
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