关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。
上个月关门了。
改进这个问题
假设我们有一个抽象类(我们称它为x),它由许多类继承(我们现在称它们为a和b)。从x继承的每个类都做相似但略有不同的事情,因此尽管它们的每个公共方法的实现可能略有不同,但它们都可以使用相同的helper函数来避免重复代码。但是,任何不是x的子类的类都不能访问这些helper函数。
此外,如果有许多helper函数只打算在扩展x的类内部使用,但每个类中需要有稍微不同的实现,该怎么办?
举个例子:
public abstract class X {
public abstract void doStuff();
int helperFunction(int a, int b) {
return a + b;
}
abstract void secondHelperFunction(int x);
}
public class A extends X {
@Override
public void doStuff() {
//do some stuff
helperFunction(a, b);
//so some other stuff
}
@Override
void secondHelperFunction(int x) {
//implementation A
}
}
public class B extends X {
@Override
public void doStuff() {
//do some different stuff
helperFunction(b, a);
//do other stuff
}
@Override
void secondHelperFunction(int x) {
//implementation B
}
}
(这个例子显然很简单,我只是想把我的观点讲清楚)
我的问题是,最好的办法是什么?例如,helper函数应该使用什么访问修饰符?显然private不是一个选项,因为这样子类就不能使用它了。default和protected听起来是更好的选择,但是它们仍然允许非子类使用这些函数,只要它们与x在同一个包中。那么,解决这个问题的最佳方案是将x和从x继承的所有类封装在它们自己的包中,与程序的其余部分分开吗?或者应该研究另一种抽象形式,例如接口(尽管我想不出一种方法来处理这个问题(特别是使用接口)
1条答案
按热度按时间ohtdti5x1#
您可以考虑以下几个选项:
使用
protected
. 正确的是,这不会阻止同一包中的其他类调用该方法。但这真的是个问题吗?包的思想是将相关类聚集在一起,并控制调用它们的接口。访问修饰符是一种相对粗糙的控制机制,主要用于帮助人们在编码时避免错误。将助手函数放在一个单独的类中,并使用组合而不是继承。您仍然可以重写方法以提供不同的行为。缺点是需要传入所需的任何值。但这并不一定是坏事,因为它清楚地表明了依赖关系。