是否可以使用子函数调用同名的父抽象函数?换句话说,我希望父类的函数是抽象的,以便它强制每个子类实现它。但是,我不想完全覆盖父的功能,我希望能够在孩子的内部调用它。像这样:
class Parent {
abstract function doSomething() {
$do = true;
}
}
class Child extends Parent {
function doSomething() {
parent::doSomething(); // sets $do = true
$also_do = true;
}
}
答案 0 :(得分:4)
Asbract方法不能有身体
abstract function doSomething();
如果您希望它有一个正文,则不得声明它abstract
。如果您想强制子类严格覆盖现有方法,那么您的设计有问题,或者您应该引入另一种方法(例如abstract function doSomethingChildSpecific()
)。
但是,可以按照已经执行的方式调用重写方法。
答案 1 :(得分:2)
在我看来,当一个程序员声明一个新的虚拟,可覆盖的方法,它的“抽象”,而不是它时,你会想到这一点。 “抽象方法”确实是新方法,但没有代码。
可能是你的意思,通过“抽象”,父类中的那种方法,什么都不做,无害,仍然被称为。这是一个不同的东西,不是一个抽象的类,但仍然是一个有效的“模式”。
有时,在编写类层次结构时,我声明了一个没有代码的全新“抽象”方法,并且必须在子类中重新声明,有时,我声明一个具有空块代码的全新方法,但是,什么都不做,仍然被召唤。
在课堂上,我也使用“DoNothing”方法。
class Parent {
function doNothing() {
// does nothing, but don't remove me !!!
}
// im a new method, but, and Im abstract,
// I must be overriden in child classes
abstract function imVirtual();
// im a new method, but, Im NOT abstract,
// I don't need to be overriden, unless you want it
function imAlsoVirtual() {
deleteHardDriveWithoutAsking();
}
// im a new method, but, Im NOT abstract
function imVirtualAndHarmless() {
doNothing();
}
} // class Parent
class Child extends Parent {
// Im overriden from an abstract method
function imVirtual() {
$do = false;
}
// Im overriden from a non-abstract method
// Im also extending previous method
function imAlsoVirtual() {
if (askUserFirst()) {
parent::imAlsoVirtual();
}
}
// im a new method, but, Im NOT abstract
function imVirtualAndHarmless() {
parent::imVirtualAndHarmless();
sayHello();
}
// im a new method
function imNewShinnyMethod() {
sayGoodBye();
}
} // class Child
答案 2 :(得分:1)
如@KingCrunch所述,abstract
函数不包含正文,只包含足迹。如果您对扩展功能感兴趣,只需重新使用方法名称,然后使用parent::
调用基本函数的方法:
class Foo
{
function Test()
{
echo "Foo->Test();\r\n";
}
}
class Bar extends Foo
{
function Test()
{
parent::Test();
echo "Bar->Test();\r\n";
}
}
$foo = new Bar();
$foo->Test();
输出:
Foo->Test();
Bar->Test();