Java 8: Child 应该从 parent 继承方法,但是 return 本身 (FluentApi)

Java 8: Child should inherit methods from parent but return itself (FluentApi)

想用流利的概念做继承api。 所以 parent Class 正在定义它的方法和 return 本身 (this)。 child 应该可以使用此方法,但 return 不是 parent 而是它自己的 class 实例!

我怎样才能做到这一点? 我想实例化 parent,所以抽象不是一个选项。

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!*

当我尝试你的代码时,返回的实例确实是 Child :

public static void main(String[] args) {
        
    Child child = new Child();
    System.out.println(child.getClass());
    System.out.println(child.doSth());
}

所以你的代码似乎有问题。请post完整代码。

在这种情况下,我们需要承认抽象和继承之间的冲突,至少在有限的方面。解决它(假设您愿意为来电者牺牲 programming to the interface)将取决于以下几点:

  • Parent.doSth() 不会实例化 new Parent() 并返回它(您的代码似乎没有)——否则您会为运行时错误腾出空间
  • 您愿意重写该方法只是为了在链式调用中携带特定类型。当然,这将适用于所有相关方法。

如果两者都是肯定的:

class Child extends Parent{
     @Override
    public Child doSth() {
         super.doSth();
        return this;
    }
}

需要注意的是,这样做会引发很多问题,其中:

  • 如果这种 Parent/Child 关系对您的来电者来说毫无意义,那么您还应该问问自己,为什么 Child 会扩展 Parent。如果你没有充分的理由,那么使用组合而不是继承。此代码剥夺了您和您的调用者 OOP 的一个关键特性(多态性,在 Parent 类型被各种 sub-classes 的对象持有的意义上)
  • 重写该方法(出于原则上不太合理的原因)可能会被解释为在没有充分理由的情况下造成维护负担。