调用父抽象函数的子函数?

时间:2011-06-14 14:44:49

标签: php oop

是否可以使用子函数调用同名的父抽象函数?换句话说,我希望父类的函数是抽象的,以便它强制每个子类实现它。但是,我不想完全覆盖父的功能,我希望能够在孩子的内部调用它。像这样:

class Parent {
    abstract function doSomething() {
        $do = true;
    }
}

class Child extends Parent {
    function doSomething() {
        parent::doSomething(); // sets $do = true
        $also_do = true;
    }
}

3 个答案:

答案 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();