我有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
的public
?第二个问题:
我创建了自己的
TextBox
,有一个名为myValue
的变量。现在,我创建一个继承AdvancedTextBox
的TextBox
,并且AdvancedTextBox
需要访问myValue
变量。问题是,我希望将来的开发人员同时使用TextBox
和AdvancedTextBox
,否则继承它们将无法访问myValue
。可能吗?编辑:Oli Charlesworth和NullUserExceptionఠ_ఠ告诉我让C直接继承A(第一个问题)。但是,在某些情况下这可能是灾难。例如:A = TextBox,B = AdvancedTextBox,C = NumberAdvancedTextBox,如果C继承了A,则C必须做一些B再次做的事情,并作一些小的改动。
最佳答案
这个怎么样 ...
将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();
}
}