当前位置: 首页 > 知识库问答 >
问题:

具有抽象的构建器模式,而不要求重写所有通用方法

燕扬
2023-03-14

我正在尝试创建不同类型的生成器,每个生成器都将具有通用和唯一的方法,因此我正在尝试为其创建某种抽象,但我遇到了一个问题。
我的代码的一个示例是:

// The abstract with all the common methods
public abstract class AbstractBuilder {

    public AbstractBuilder commonMethod() { 
        // implementation here
        return this;
    }

}

// Builder 1
public class MainBuilder extends AbstractBuilder {
    
    public MainBuilder mainUniqueMethod() {
        // implementation here
        return this;
    }

}

// Builder 2
public class SecondBuilder extends AbstractBuilder {
    
    public SecondBuilder secondUniqueMethod() {
        // implementation here
        return this;
    }

}

这个问题会出现在和建筑工人一起工作的时候,比方说我是这样做的

new MainBuilder().mainUniqueMethod().commonMethod(); // Possible
new MainBuilder().commonMethod().mainUniqueMethod(); // Impossible because commonMethod returns `AbstractBuilder`

因此,我找到的解决此问题的唯一方法是始终重写main方法,然后对main方法执行超级调用,如下所示:

@Override
public MainBuilder commonMethod() {
    return (MainBuilder) super.commonMethod();
}

但如果常用的方法足够大,这可能会非常重复,也许这是一个糟糕的设计,但我想知道是否有一个更有效的方法来实现这一点。

共有1个答案

柯瀚海
2023-03-14

您可以在此处使用泛型:

public abstract class AbstractBuilder<T extends AbstractBuilder<T>> {

  public T commonMethod() { 
    // implementation here
    return getThis();
  }

  @SuppressWarnings("unchecked")
  protected T getThis() {
    return (T)this;
  }
}

class MainBuilder extends AbstractBuilder<MainBuilder> { ... }

这样,公共基类就可以“知道”实际返回什么子类型。getThis()方法需要一个难看的强制转换,如果您使用类似Class SecondBuilder extends AbstractBuilder 之类的东西,该转换可能会中断,因此出现警告。所以要注意如何实现子类。

解决这一问题的一种方法是使getThis()抽象并让每个子类实现它。

 类似资料:
  • 问题内容: 当其中的所有方法都是具体的时,有人在声明类抽象时有一些实际的编程情况吗? 问题答案: 好吧,您可能正在使用模板方法模式,其中存在多个都具有默认实现的覆盖点,但是组合的默认实现本身不合法-任何功能实现都必须是子类。 (是的,我不喜欢模板方法模式;)

  • 所以,问题是:我有一个抽象基类(),它有一个抽象成员方法()。方法返回布尔值,并应检查是否相等,但“相等”在子类中可能有不同的解释,因此我不重写或。因为它测试是否与另一个与其类型相同的对象相等,所以签名如下所示: 现在,当我试图在类中重写它时,假设“”,我不能使用作为参数的类型。我知道一般情况下这样做的原因和添加类型界限的建议,但是事情变得更加复杂,因为参数类型是它自己的类。 有没有什么平滑的方法

  • 所以我试图扩展一个employee抽象类。代码如下: 现在,正如您所看到的,我已经在两个子类中遍历了抽象方法getFeedback。但我得到了这个错误: 那么问题是什么呢?为什么在两个子类中都编写了getFeedback方法,却引发了这个错误

  • 为什么我从下面的代码中得到这个编译错误消息? (程序根据键盘上按下的箭头键,在4个方向上移动箭头:d) Direction.java:41:错误:DirectionBoard。DirectionListener不是抽象的,并且不会覆盖KeyListener中的抽象方法keyReleated(KeyEvent)

  • 大家好,我有这个主课堂 错误:(42,8)错误:Home不是抽象的,并且不会覆盖OnFragmentInteractionListener中的onFragmentInteract(String)抽象方法 我创建了一个导航抽屉,并希望有一个新的片段来显示另一个家庭活动的内容。 Android Studio告诉我做个家。类抽象或实现抽象方法。 里面: 我那样做了,但是什么也没有改变。我不能让home类

  • 在一个具有(控制器-服务-DAO-实体层)的spring hibernate Java项目中,我使用了抽象工厂模式(抽象类有2个抽象方法)。在实现的抽象工厂模式类中,我有dao方法(运行命名查询)。现在,当请求到达来自另一个服务类的dao的服务impl时,它给出了空指针删除,我已经在服务impl中自动连线了dao类` 我不能将@Service(“AbstractFruitService”)添加到S