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

Java 我的类中变量和函数的可访问性,java,.net,oop,Java,.net,Oop,我有两个问题,但它们是关于相同(相似?)的问题 第一个问题: public class A { public void myProcedure() { doSomethingA(); } private void doSomethingA() {} } public class B extends A { @Override public void myProcedure() { doSomethingB();

我有两个问题,但它们是关于相同(相似?)的问题

第一个问题:

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
设置为
public

第二个问题:

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
    }

}
我创建了自己的
文本框
,其中有一个变量名为
myValue
。现在我创建了一个继承
TextBox
AdvancedTextBox
,并且
AdvancedTextBox
需要访问
myValue
变量。问题是,我希望未来的开发人员同时使用
TextBox
AdvancedTextBox
,或者继承它们无法访问
myValue
。可能吗


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

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

这个怎么样

  • 把A和C放在同一个包里,然后把B放在不同的包里
  • 从A.doSomethingA()中删除“private”
  • 给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(); 
    }

}

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

首先:使其受保护,而不是私有。通过,类型为
C
的对象的行为应类似于
B
的专门化。如果你不得不将行为“回归”到
A
,这意味着你的层次结构不正确。我同意@OliCharlesworth。如果你需要从C访问A的方法,也许C应该直接从A继承。@OliCharlesworth我编辑了我的问题(在末尾添加信息),告诉案例C不应该直接从A继承。好的,那么如果你坚持你的层次结构
C->B->A
,那么你的方法的设计是不正确的。您在
B
中重写了
A.myProcedure
,使得无法从
C
的实例调用它。C必须扩展B。但是,也许
protected
可以解决问题?