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()李>
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
可以解决问题?