2012-09-26 66 views

回答

4

如果你想添加功能的類添加一個方法。但是,有些情況下您想添加功能,但不能在基類中執行此操作。

最好的是用一個例子展示。如果將某個方法Radius添加到類只有在類爲Circle時纔有意義,則Rect不具有半徑。向基類中添加方法Radius也是沒有意義的,因爲Rect類也可以獲得方法Radius

例子:

abstract class Shape 
{ 
    abstract public function Draw(); 
} 

class Rect extends Shape 
{ 
    public function Draw() 
    { 
    } 
} 

class Circle extends Shape 
{ 
    public function Draw() 
    { 
    } 

    public function Radius() 
    { 
    } 
} 
+0

我得到你要去的地方...然而,如果在擴展類中添加繪製方法而不是在形狀類中繪製目的,從而使擴展類的全部理由(DRY編碼)毫無意義? – TheBestJohn

+0

形狀類中的繪製方法應該是抽象的,沒有辦法繪製一個Shape。我調整了這個例子。 – JvdBerg

+0

好了,現在看起來我已經有了更多的閱讀和理解。感謝您指點我正確的方向。 – TheBestJohn

2

有時原來的類是不能更改庫的一部分。

有時候你想用多種不同的方式來擴展超類。

例如(Java語法,而不是PHP但想法是相同的):

class Shape { 
    abstract double getArea(); 
} 

class Square extends Shape { 
    double getArea() { 
    return size * size; 
    } 
} 

class Circle extends Shape { 
    double getArea() { 
    return radius * radius * Math.PI; 
    } 
} 

到接受型形狀的參數可以在正方形以及圈傳遞的方法。該方法不需要知道它獲取哪個,但仍然可以調用getArea()。如果您只是將該方法添加到Shape類,這將不起作用。

+0

@vascowhite:你爲什麼編輯我的帖子?現在這是不正確的。 – user1701374

+0

,因爲它沒有意義的方法有一個getCircumference()方法。爲什麼現在不正確?它看起來很適合我。你在方法中的計算是針對區域的。而且,自從我編輯它以來,你已經有三個upvotes(它在-1)。 – vascowhite

+0

謝謝你們對我現在有意義的信息。 – TheBestJohn

2

這將是一個簡化,但給你一個真實生活中的例子:

考慮您要創建一個內容管理系統,即一個腳本來顯示基於用戶輸入您的網站的不同頁面。

您可能希望每個頁面(讓我們稱之爲模塊)具有特定的功能,例如在頁面/模塊上執行時允許執行的命令。這些不同的命令可能是每個模塊類中的不同方法。

但是,如果您允許登錄命令,無論用戶當前位於您的網站中,該怎麼辦?即,這將是所有模塊之間共享的命令。

您的解決方案可以通過擁有父模塊類來解決,其中的登錄方法將駐留在該模塊類中,並且可以由所有模塊執行。

// Your parent class 
abstract class ParentModule 
{ 
    protected function login() 
    { 
     // Login stuff 
    } 
} 

// One of your modules 
final class ArticleModule extends ParentModule 
{ 
    public function submit_article() 
    { 
     // An example function 
    } 
} 

// Another one of your modules that the user could still login from 
final class AnotherModule extends ParentModule 
{ 
    public function another_command() 
    { 
     // Magic 
    } 
} 

您的控制器可能會看起來像下面的東西。

$module = new ArticleModule(); 
$module->login(); 
$module->submit_article(); 

最後,當你進入看着接口 - 帶我永遠理解這些 - 你將再次看到抽象類的好處。事實上,如果你完全理解抽象類的概念,你將更容易理解接口。

相關問題