我有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
变量。问题是,我希望未来的开发人员同时使用AdvancedTextBox
和myValue
,或者继承它们无法访问TextBox
。有可能吗?
编辑: Oli Charlesworth和NullUserExceptionఠ_告诉我让C直接继承A(第一个问题)。但是,在某些情况下这可能是灾难。例如:A = TextBox,B = AdvancedTextBox,C = NumberAdvancedTextBox,如果C继承A,那么C必须再次执行B所做的所有操作,并进行一些小的更改。
答案 0 :(得分:2)
这个怎么样......
这是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范围修饰符的故意意图是它们仅在您直接调用函数时应用,而不是通过另一个函数间接调用。这样,类可以具有少量定义公共接口的公共函数。这可以仔细记录并且非常稳定。然后,这些公共函数可以调用任意数量的私有函数,您可以自由地调整这些私有函数,比如提高性能,或者使用新环境等,而无需更改公共接口。