2011-11-12 22 views
0

我有兩個問題,但它們大概是相同的(相似?)問題。我的課程中變量和函數的可訪問性

第一個問題:

public class A { 

    public void myProcedure() { 
     doSomethingA(); 
    } 

    private void doSomethingA() {} 

} 

public class B extends A { 

    @Override 
    public void myProcedure() { 
     doSomethingB(); 
     // IT DOESN'T CALL super.myProcedure 
    } 

    private void doSomethingB() {} 

} 

public class C extends B { 

    @Override 
    public void myProcedure() { 
     // I need to execute A's myProcedure here 
    } 

} 

如何運行AmyProcedure,竟未doSomethingApublic

第二個問題:

創建我自己的TextBox,有一個名爲myValue變量。現在我創建一個AdvancedTextBox,它繼承TextBoxAdvancedTextBox需要訪問myValue變量。問題是,我希望未來的開發者同時使用TextBoxAdvancedTextBox,或者繼承他們不能訪問myValue。可能嗎?

編輯: Oli Charlesworth和NullUserExceptionఠ_ఠ告訴我讓C直接繼承A(第一個問題)。但是,有些情況可能會造成災難。例如:A = TextBox,B = AdvancedTextBox,C = NumberAdvancedTextBox,如果C繼承了A,所以C必須做一切B再做的事情,只需稍作更改。

+0

第一:使它受到保護,而不是私人的。 – corsiKa

+3

由[替代原則](http://en.wikipedia。org/wiki/Liskov_substitution_principle),'C'類型的對象應該像'B'的專業化一樣。如果您不得不將行爲「倒退」回到「A」,這意味着您的層次結構不正確。 –

+0

我同意@OliCharlesworth。如果你需要從C訪問A的方法,也許C應該直接從A. – NullUserException

回答

2

這個怎麼樣...

  • 認沽A和C在同一個包,然後把的B不同的包。
  • 從A.doSomethingA刪除 「私有」()
  • 鑑於C A的一個實例(回禮組成在繼承)
  • 由於C和A都在同一個包,C可以調用A.doSomethingA()任何時候。

這裏是甲

package ac; 

public class A { 

    public void myProcedure() { 
     doSomethingA(); 
    } 

    void doSomethingA() {} 

} 

定義這裏是B的定義

package b; 

public class B extends A { 

    @Override 
    public void myProcedure() { 
     doSomethingB(); 
     // IT DOESN'T CALL super.myProcedure 
    } 

    private void doSomethingB() {} 

} 

這裏是Ç

package ac; 
// do you really need to extend B? 
public class C { 
    A a = new A(); 

    public void myProcedure() { 
     a.doSomethingA(); 
    } 

} 
+0

C必須擴展B.但是,也許'protected'可以解決這個問題? –

0

由於doSomethingA是一個實現細節。我會將它從一個私有變爲受保護的,以允許子類直接調用它。

0

定義如果一些外部模塊調用A.myProcedure ,doSomethingA沒有必要公開。另一個模塊不直接調用doSomethingA,這就是最重要的。 Java範圍修飾符的深思熟慮的意圖是它們僅適用於直接調用函數時,而不是通過其他函數間接調用。這樣一個類可以有少量定義公共接口的公共函數。這可以仔細記錄和非常穩定。然後這些公共函數可以調用任意數量的私有函數,您可以自由地將這些私有函數進行混洗,例如提高性能,或者使用新環境等,而無需更改公共接口。