我的情况如下
interace A {
}
class B implements A {
}
现在在进行更改时,我意识到我必须将一段重复的代码提取到一个方法中。
说B类中有如下方法:
private void domSomething() {
//sequence of steps
}
现在,问题在于,将来我们希望接口A的其他实现使用方法doSomething()
。
所以这里的困境是应该将方法doSomething()移动到util类,还是应该使用受保护的doSomething()
方法创建一个抽象类。像下面的东西。
abstract class C implements A {
protected void doSomething();
}
class B extends C {
}
或创建一个Utils类,让B仍然实现A.
一般来说,我喜欢不使用抽象并寻找避免它们的方法。所以这引出了一些问题:
答案 0 :(得分:3)
我会更喜欢" util class" (但不是静态的!只是另一个定义共同行为的类)。换句话说,就是继承"构成而不是继承"。
更多信息为什么在这里:
答案 1 :(得分:0)
private void domSomething()
不返回值,即表示方法更新某些状态,它可以是全局状态(数据库或外部资源),也可以是此方法存在于类的内部状态。
如果方法根据类的内部成员更新全局状态,则应将其移动到另一个类,并将所有必需的数据作为参数传入
public class Util
{
public void DoSomething(value1, value2) {}
}
如果方法更新了类的内部状态,那么它可以放在抽象类中,因此所有派生类都可以访问它。
public abstract class A
{
protected void DoSomething() {}
}
如果你想让派生类有可能改变它的行为,那么make方法是虚/可覆盖的。
答案 2 :(得分:0)
在为类中的某些层次结构建模时使用抽象类,将常用逻辑移动到父级,更多地尝试使用组合而不是继承
当逻辑非常通用并且可以由多个类使用时,使用静态util / helper类,例如FileUtils.createTmpFile