我的类中的变量和函数的可访问性

时间:2011-11-12 02:01:53

标签: java .net oop

我有2个问题,但它们的问题大致相同(类似?)。

第一个问题:

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
    }

}

如何在未将A设置为myProcedure的情况下运行doSomethingA的{​​{1}}?

第二个问题:

我创建了自己的public,有一个名为TextBox的变量。现在我创建一个继承myValue的{​​{1}},AdvancedTextBox需要访问TextBox变量。问题是,我希望未来的开发人员同时使用AdvancedTextBoxmyValue,或者继承它们无法访问TextBox。有可能吗?

编辑: Oli Charlesworth和NullUserExceptionఠ_告诉我让C直接继承A(第一个问题)。但是,在某些情况下这可能是灾难。例如:A = TextBox,B = AdvancedTextBox,C = NumberAdvancedTextBox,如果C继承A,那么C必须再次执行B所做的所有操作,并进行一些小的更改。

3 个答案:

答案 0 :(得分:2)

这个怎么样......

  • 将A和C放在同一个包中,然后将B放在不同的包中。
  • 从A.doSomethingA()
  • 中删除“私人”
  • 给C一个A的实例(赞成组合而不是继承)
  • 由于C和A在同一个包中,C可以随时调用A.doSomethingA()。

这是A

的定义
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() {}

}

这是C

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

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

}

答案 1 :(得分:0)

因为doSomethingA是一个实现细节。我会将它从private更改为protected,以允许子类直接调用它。

答案 2 :(得分:0)

如果某些外部模块调用A.myProcedure,则doSomethingA不必是公共的。另一个模块没有直接调用doSomethingA,这就是最重要的。 Java范围修饰符的故意意图是它们仅在您直接调用函数时应用,而不是通过另一个函数间接调用。这样,类可以具有少量定义公共接口的公共函数。这可以仔细记录并且非常稳定。然后,这些公共函数可以调用任意数量的私有函数,您可以自由地调整这些私有函数,比如提高性能,或者使用新环境等,而无需更改公共接口。