2011-11-12 23 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范围修饰符的深思熟虑的意图是它们仅适用于直接调用函数时,而不是通过其他函数间接调用。这样一个类可以有少量定义公共接口的公共函数。这可以仔细记录和非常稳定。然后这些公共函数可以调用任意数量的私有函数,您可以自由地将这些私有函数进行混洗,例如提高性能,或者使用新环境等,而无需更改公共接口。