當我來到OOP的課程時,我終於有了我的阿哈。我一直在努力想出這個想法。現在我開始明白了,我想知道擴展類的目的是什麼。在課堂上添加另一種方法會不會更簡單?還是我錯過了這一點?爲什麼要擴展一個類而不是僅僅向原始類添加一個新方法?
回答
如果你想添加功能的類添加一個方法。但是,有些情況下您想添加功能,但不能在基類中執行此操作。
最好的是用一個例子展示。如果將某個方法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()
{
}
}
我得到你要去的地方...然而,如果在擴展類中添加繪製方法而不是在形狀類中繪製目的,從而使擴展類的全部理由(DRY編碼)毫無意義? – TheBestJohn
形狀類中的繪製方法應該是抽象的,沒有辦法繪製一個Shape。我調整了這個例子。 – JvdBerg
好了,現在看起來我已經有了更多的閱讀和理解。感謝您指點我正確的方向。 – TheBestJohn
有時原來的類是不能更改庫的一部分。
有時候你想用多種不同的方式來擴展超類。
例如(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類,這將不起作用。
@vascowhite:你爲什麼編輯我的帖子?現在這是不正確的。 – user1701374
,因爲它沒有意義的方法有一個getCircumference()方法。爲什麼現在不正確?它看起來很適合我。你在方法中的計算是針對區域的。而且,自從我編輯它以來,你已經有三個upvotes(它在-1)。 – vascowhite
謝謝你們對我現在有意義的信息。 – TheBestJohn
這將是一個簡化,但給你一個真實生活中的例子:
考慮您要創建一個內容管理系統,即一個腳本來顯示基於用戶輸入您的網站的不同頁面。
您可能希望每個頁面(讓我們稱之爲模塊)具有特定的功能,例如在頁面/模塊上執行時允許執行的命令。這些不同的命令可能是每個模塊類中的不同方法。
但是,如果您允許登錄命令,無論用戶當前位於您的網站中,該怎麼辦?即,這將是所有模塊之間共享的命令。
您的解決方案可以通過擁有父模塊類來解決,其中的登錄方法將駐留在該模塊類中,並且可以由所有模塊執行。
// 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();
最後,當你進入看着接口 - 帶我永遠理解這些 - 你將再次看到抽象類的好處。事實上,如果你完全理解抽象類的概念,你將更容易理解接口。
- 1. 僅向一個方向擴展SKSpriteNode
- 2. 爲什麼putExtra需要一個關鍵值對而不僅僅是一個值?
- 3. 如果一個類擴展了另一個類,擴展類可以被初始化而不是擴展它嗎?
- 4. 爲什麼我的jQuery僅在一個方向上切換類?
- 5. 爲什麼一個「新」方法保存我的關係,而不是僅僅對其進行初始化
- 6. 爲什麼你會想要創建一個名爲* foo()而不是僅僅是foo()的方法?
- 7. 爲什麼名稱形成一種而不僅僅是一種類型?
- 8. 爲什麼案例類僅擴展Product而不擴展Product1,Product2,...,ProductN?
- 9. 爲什麼rbind需要一個循環來創建一個數據幀,而不僅僅是一個矩陣
- 10. 爲什麼我們需要一個明確的轉換,而不是擴展方法而不是靜態方法?
- 11. 如何向類中添加方法而不創建擴展它的新類。
- 12. DDD - 爲什麼實體的身份不僅僅是原始類型?
- 13. 如何獲得EntityCollection <class>而不僅僅是一個類?
- 14. 僅向最接近的父類添加一個類
- 15. 爲什麼要使用一個DLL,而不是一類
- 16. 爲什麼Solr存儲一個字段的原始/預先分析內容而不僅僅是索引?
- 17. 爲什麼使用「RIA Services Link」而不是僅僅是一個OData端點?
- 18. 我應該擴展這個類還是僅僅使用它?
- 19. 爲什麼要深入克隆一個JavaScript對象而不是僅僅創建一個副本?
- 20. 爲什麼他們想要一個'unsigned char *'而不僅僅是一個普通的字符串或'char *'
- 21. Ruby擴展Date類添加新方法
- 22. 爲什麼我需要*,*:在{...}之後而不是僅僅是{...}?
- 23. 爲什麼我的第一個Android MainActivity類擴展了ActionBarActivity而不是Activity?
- 24. 擴展一個泛類的原始類型警告
- 25. setTimeout爲整個網站,而不僅僅是一個頁面
- 26. 爲什麼Java中的類名(和其他)僅僅是一個建議而不是規則?
- 27. 爲什麼我不能添加一個從SimplePanel擴展到RootPanel的類?
- 28. 爲什麼所有記錄都被刪除,而不僅僅是一個?
- 29. 整個世界爲什麼翻譯而不僅僅是對象?
- 30. 如何擴展一個類的邊界而不是其他類
的目的是爲了避免重複的代碼。並訪問所提到的類的所有方法。 –