我应该使用抽象类还是Util类?

时间:2017-07-29 06:57:20

标签: java c# oop design-patterns

我的情况如下

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.

一般来说,我喜欢不使用抽象并寻找避免它们的方法。所以这引出了一些问题:

  1. 考虑抽象类是正确的方法吗?
  2. 这里应该更优选哪种方法,为什么?
  3. 思想过程背后的任何其他建议总是受到欢迎。

3 个答案:

答案 0 :(得分:3)

我会更喜欢" util class" (但不是静态的!只是另一个定义共同行为的类)。换句话说,就是继承"构成而不是继承"。

更多信息为什么在这里:

Prefer composition over inheritance?

答案 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