PHP。是否可以将非抽象方法重新声明为抽象方法?
Key类有一个非抽象方法getDescription()(用于多种用途) 键类由“子抽象类”之一扩展 “子抽象类”由“具体类”扩展 我想强制“具体类”实现getDescription()方法,并尝试在“子抽象类”中将其重新声明为抽象方法,但失败了 那么,是否可以在php中将非抽象方法重新声明为抽象方法? 如果没有-如何强制实施具体方法 关键类。我需要以这种方式声明的getDescription用于许多目的 抽象类重写了getDescription()-但不起作用 具体类,必须重新实现getDescriptionPHP。是否可以将非抽象方法重新声明为抽象方法?,php,oop,inheritance,abstract-class,Php,Oop,Inheritance,Abstract Class,Key类有一个非抽象方法getDescription()(用于多种用途) 键类由“子抽象类”之一扩展 “子抽象类”由“具体类”扩展 我想强制“具体类”实现getDescription()方法,并尝试在“子抽象类”中将其重新声明为抽象方法,但失败了 那么,是否可以在php中将非抽象方法重新声明为抽象方法? 如果没有-如何强制实施具体方法 关键类。我需要以这种方式声明的getDescription用于许多目的 抽象类重写了getDescription()-但不起作用 具体类,必须重新实现getDes
我认为主要的问题是你如何实施这个 如果您的类已经实现了一个方法,那么默认情况下,它的所有子类都将实现它 因此,假设您有以下几点:
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