2009-08-18 48 views
0

簡單地作爲一個例子,抽象類中字段的可訪問性應該是什麼?

public abstract class AbstractFellow { 

    protected Thing buddy; 
.... 

public class ConcreteFellow extends AbstractFellow { 
    public void someMethod() { 
      buddy.doSomething(); 
      //OR 
      buddy = somethingElse; 
      //OR 
      somethingElse = buddy; 
    } 
} 

這是不好的做法?

回答

1

意見不盡相同。我的觀點是,即使在抽象類中,使用私有成員和受保護訪問者(即protected getBuddy())也是一種更好的做法。

它允許始終允許封裝的相同事物:包含在超類中獲取「夥伴」對象的邏輯,並允許您在不中斷所有繼承類的情況下更改該邏輯。

超級類別可能不希望buddy被更改。例如,您可能希望取消註冊偵聽器,或者在發生這種情況時執行一些其他清理 - 使用setter方法可以實現此目的。

此外,它顯然允許您將Buddy作爲只讀成員(因爲您只能提供getBuddy而不能提供setBuddy),這對於使用成員來說並非易事(您可以隨時設置它爲final,但那麼你也阻止超類改變它!)

+0

是的,但它取決於語言。 – jro 2009-08-18 20:26:20

+0

什麼取決於語言?在所有OO語言中,這都是事實。唯一不同的可能是'final'字段修飾符,它可能會被調用或根本不存在。 – 2009-08-18 20:29:22

+0

我在談論Java,但我認爲這個概念已經足夠普遍適用於其他類似的語言。 – 2009-08-18 20:30:04

1

它取決於你的域模型以及爲什麼你創建和抽象類。如果你正在爲它定義你的接口,並希望抽象類保持一些功能,那麼可以。

如果您只是設置了所有受保護的字段,然後在您的子類中重新使用它們。這取決於,但我認爲應找到更好的方法。對於未來的讀者來說,在基類中獲取數據以及在子類中的所有行爲似乎都不是很清楚。 如果你不需要基類的能力來實現方法(並且你不需要在你的基類中存儲任何功能),也許這是一個更好的選擇來實現與這些子類的每一個接口。

如果你使用一些基類的內部字段,這對我來說似乎很自然,並且沒關係。就好像你在你的孩子班中使用其中的一些類似的東西,你可以實現一個模板方法,並享受只覆蓋你真正需要覆蓋的部分。

相關問題