2011-02-23 43 views
1

爲您介紹OOP的問題:抽象類和驗證方法

情況:我想用一個公共setter和抽象驗證一個抽象類,因爲每個孩子將驗證以獨特的方式該屬性。

代碼:

abstract class Parent { 
    public function setName($name) { 
     if (validateName($name)) { 
      $this->_name = $name; 
     } else { 
      // error msg 
     } 
    } 

    abstract public function validateName($name); 
} 

class Child extends Parent { 
    public function validateName($name) { 
     // ensure name gits this child's requirements 
    } 
} 

問題:這是一個 「合法」 的設計方式?我想,因爲setName方法對於每個子類都是相同的,所以它應該是父類中的公共方法,但驗證程序應該是抽象的,以強制子類實現它。

我只是勾畫了這一點,在紙上概念...

+1

人們習慣於弱智化的例子,讓其他人可以快速獲得問題的根源。通常情況下,這是非常好的,但是如果問題是關於最佳面向對象操作的問題,那麼知道確切的上下文是什麼變得至關重要。類旨在表示*東西*;不知道這些東西是什麼,沒有什麼可以設計一個類。 – erisco 2011-02-23 05:51:10

+0

在法律上,法律試圖與公正匹配。在物理學中,法律可以是攻擊孤兒的電鋸兇手。編程中的法律更像物理上的法律。 – erisco 2011-02-23 06:17:02

+0

真的沒有那麼多,但我很欣賞您的反饋。更多的數據是'Parent'類是一個通用的遊戲類,我們想要設置勝利的一面。小孩'GameA'只有兩面,所以有效的贏面將是1,2或0(平局)。 'GameB'支持8名球員,並且可以有平局,個人獲勝者或者2人或3人的獲勝團隊。所以,我想在父級中定義setter,並讓子級決定驗證。這對我來說似乎合乎邏輯,但我只是將我的小拇指蘸入OOP。 – Drew 2011-02-23 06:46:09

回答

2

是的,這是一個有效的方法,雖然你在不完美的語法:

 if (validateName($name)) { 

應該是這樣的:

 if ($this->validateName($name)) { 

但是,如果這是架構的範圍,爲什麼不定義抽象setName()驗證並設置它?像這樣:

interface Parent { 
    public function setName($name); 
} 

class Child implements Parent { 
    public function setName($name) { 
     if (/* $name is valid */) { 
      $this->_name = $name; 
     } else { 
      // error message 
     } 
    } 
} 

當然我在這裏使用一個接口,因爲在Parent中沒有代碼。

但請明白,這取決於你如何是程序的結構。我必須至少看到該程序架構的圖表,以絕對的方式說出。

+0

嗨,約拿。謝謝你的回答。你能否澄清一下你的建議,從「爲什麼不只是......」開始 - 我沒有明白你的意思。 – Drew 2011-02-23 04:14:40

+1

這個改變有不同的意思,約拿,但我不是說這是錯的。在原始文件中,父級強制執行參數設置的過程(並且該方法應定義爲最終)。隨着你的改變,孩子被要求以任何想要的方式設置參數(或不選)。希望這有助於澄清差異,安德魯希思。 – erisco 2011-02-23 06:10:17

+0

我明白接口派生的替代喬納提出,現在有一些示例代碼。無論如何,他回答了我原來的問題,並提出了一個額外的想法。謝謝你們兩位! – Drew 2011-02-23 06:47:40