我想用流畅api的概念做继承。所以父类定义它的方法并返回它自己(this)。子类应该能够使用这些方法,但是返回的不是父类而是它自己的类实例!
我怎样才能做到这一点?我想实例化父类,所以抽象不是一个选项。
public class Parent {
// fields, constructor a.s.o
public Parent doSth() {
//doSth
return this;
}
}
public class Child extends Parent{
// fields, constructor a.s.o
}
如果我现在执行…
new Child().doSth() => *is returning Parent, not Child!*
在这种情况下,我们需要承认抽象和继承之间的冲突,至少在有限的方面是这样。解决这个问题(假设您愿意牺牲编程来为调用者提供接口)将取决于以下几点:
Parent.doSth()
没有实例化new Parent()
并返回它(你的代码似乎没有)-或者你会为运行时错误腾出空间- 为了在链式调用中携带特定类型,你愿意重写该方法。当然,这将适用于所有相关方法。
如果两者都有yes:
class Child extends Parent{
@Override
public Child doSth() {
super.doSth();
return this;
}
}
需要注意的是,这样做会引起很多问题,其中包括:
- 如果这个父/子关系对你的调用者没有任何意义,那么你也应该问自己为什么
Child
要扩展Parent
。如果没有很好的理由,那么使用组合而不是继承。这段代码剥夺了您和您的调用者OOP的一个关键特性(多态性,在各种子类的对象持有Parent
类型的意义上) - 重写方法(出于一个不太合理的原因,就原则而言)可能会被解释为在没有可靠理由的情况下创建维护负担。
当我尝试你的代码返回的实例确实是Child:
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.getClass());
System.out.println(child.doSth());
}
看来你的代码有问题。请张贴完整的代码。