我有一个像这样的课程
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我想让情况一说你好。我很高兴第二种情况能说再见。
有没有什么我可以做的(大概是在that ()的实现中)来表明必须在Base中使用greet()的实现?
(换句话说,Base很乐意让扩展类覆盖greet(),但当calls ()调用greet()时,它希望它使用Base中定义的已知行为,而不是其他地方定义的未知行为。)
发布于 2017-03-20 21:07:05
由于您希望在不同的情况下实现不同的功能,因此需要创建两个类实现。
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();发布于 2017-03-20 21:29:14
这是向您介绍Interfaces的最佳场景。在这种特殊情况下,您将需要以下接口:
interface MyClassInterface
{
public function greet();
public function speak();
}如果你不想覆盖它,那就不要在speak方法中调用greet:
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 goodbyehttps://stackoverflow.com/questions/42904330
复制相似问题