【发布时间】:2021-11-12 17:46:33
【问题描述】:
我正在尝试实现 Fluet 接口模式。所以基本上这个想法是有链接方法,但我是 将它与策略模式混合,所以我可以有多个“Foo”的实现
我有这个抽象类:
public abstract class Foo<T extends BarData> {
T data;
public Foo(T data) {
this.data = data;
}
public Foo<T> fooMethod {
// do stuff with data
return this;
}
}
这是另一个提供另一种方法的 Foo 实现:
public class Bar extends Foo<BarData> {
public Bar(BarData data) {
super(data);
}
public Bar barMethod() {
// do more stuff with data
return this;
}
}
流畅的界面:
public interface FluentInterface<T extends BarData, S extends Foo<T>> {
S initialize();
}
基本实现:
public class BasicFluentInterfaceImplementation implements FluentApi<BarData, Bar> {
@Override
Bar initialize() {
// prepares data
return new Bar(data);
}
}
一起使用:
public class Main {
public static void main(String[] str) {
FluentInterface api = new BasicFluentInterfaceImplementation();
var firstReturn = api.initialize(); // Here it returns Bar
var secondReturn = firstReturn.fooMethod(); // As Bar extends Foo i can call the fooMethod()
var thirdReturn = secondReturn.barMethod(); // Here is the problem, i can't call the barMethod, because fooMethod already returned an intance of Foo
}
}
如何让 Foo 返回 Bar 的实例?考虑到 Bar 可以是任何扩展 Foo 的东西。
【问题讨论】:
-
我想你想要
class Bar<T extends BarData> extends Foo<T> -
你不能。您的
FluentInterface#initialize和Foo#fooMethod都返回Foo,这就是游戏结束的地方。 -
另外,只是一个警告:小心使用
var和泛型。您可能很难使用通配符捕获。