2011-06-14 58 views
0

是否可以有一個子函數調用同名的父抽象函數?換句話說,我希望父母的功能是抽象的,以便強制每個孩子實現它。但是,我不想完全覆蓋父母的功能,我希望能夠在孩子的內部調用它。事情是這樣的:調用父抽象函數的子函數?

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

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

回答

4

Asbract方法不能有身體

abstract function doSomething(); 

如果你希望它有一個身體,你不能把它聲明abstract。如果您想強制兒童班級嚴格覆蓋現有方法,那麼您的設計出現問題,或者應該引入其他方法(例如abstract function doSomethingChildSpecific())。

但是,它有可能以你已經做到的方式調用重寫的方法。

+0

好的。我曾想過有兩個函數(具體()是抽象的),但只是想知道是否可能只有一個函數。 – andrewtweber 2011-06-14 14:53:18

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(); 
+0

和ideone演示:http://www.ideone.com/qEvE6 – 2011-06-14 14:55:06

1

在我看來,你是認爲當程序員聲明一個新的虛擬的可重寫的方法時,它的「抽象」,而不是。 「抽象方法」是新方法,但沒有代碼。

可能是你的意思,通過「抽象」,在父類中的方法,什麼都不做,無害,仍然被調用。這是一個不同的東西,不是一個抽象類,但仍然是一個有效的「模式」。

有時,在編寫類層次結構時,我聲明瞭一個全新的「抽象」方法,它沒有代碼,必須在子類中重新聲明,有時我聲明瞭一個全新的方法,但是,什麼都不做,仍然會被調用。

在類中,我也使用了「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