我有一个像
这样的课程class Base
{
public function greet()
{
print "hello";
}
public function speak()
{
$this->greet();
}
}
和类似的
class Extension extends Base
{
public function greet()
{
print "goodbye";
}
}
我有这段代码:
$extension = new Extension();
//Situation One
$extension->speak(); //This says goodbye
//Situation Two
$extension->greet(); //This says goodbye
我希望情况一开口打招呼。我很高兴情况二说再见。
我能做些什么(大概是在speak()的实现中)来表明必须使用Base中greet()的实现吗?
(换句话说,Base很高兴扩展类覆盖greet()但是当speak()调用greet()时,它希望它使用Base中定义的已知行为,而不是其他地方定义的未知行为。)
答案 0 :(得分:0)
由于您在不同情况下需要不同的功能,因此请创建两个类实现。
class Base
{
public function greet()
{
print NULL;
}
public function speak()
{
this->greet();
}
}
class Goodbye extends Base
{
public function greet()
{
print "goodbye";
}
}
class Hello extends Base
{
public function greet()
{
print "hello";
}
}
一种情况。
$hello = new Hello();
$hello->greet();
另一种情况。
$goodbye = new Goodbye();
$goodby->greet();
答案 1 :(得分:0)
这是向接口介绍自己的完美场景。在这种特殊情况下,您需要以下界面:
interface MyClassInterface
{
public function greet();
public function speak();
}
如果您不想覆盖它,请不要在speak方法中调用问候语:
abstract class Base
{
public function speak()
{
print "hello";
}
}
class Extension extends Base implements MyClassInterface
{
public function greet()
{
print "goodbye";
}
}
$extension = new Extension();
// Situation One
$extension->speak(); // This says hello
// Situation Two
$extension->greet(); // This says goodbye