2016-12-29 56 views
2

关键类有一个非抽象方法getDescription()(出于多种目的)。PHP。是否有可能将非抽象方法重新声明为抽象?

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

“小孩抽象类”由“具体类”扩展。

我想强制“具体类”实现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(); 
}; 

混凝土类,它必须reimpliment getDescription。

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

我们可以看到一些代码吗? – Federkun

回答

2

是否有可能重新声明非抽象方法为抽象的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 
+0

不过,关键的问题仍然是:“是否可以重新声明具体方法为php中的抽象”? – bbe

+0

@bbe,请参阅我的更新 – RomanPerekhrest

+0

然而,在Java中这种对“具体到抽象”的重新声明是可能的。 – bbe

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 
} 

所以,你想要做的是覆盖默认功能。

我想你应该花一些时间,并重新考虑结构是否正确。

调味品Deccorator不能成为界面吗?

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. 
} 

所以后来类鳄梨需要实现getDescription作为饮料会一直为好,你应该没有冲突。

+0

我想过使用界面,没有尝试,但有一种感觉,它也会导致冲突。 饮料类必须具有具体的getDescription();使用与父项相同的方法定义子类的接口已经听起来不太好。抽象问题(即将具体抽象为抽象)仍然存在。 – bbe

+0

我的建议是做这样的事情: – Unamed

相关问题