首页 > 解决方案 > 如何在超类中创建一个返回类型子类的方法

问题描述

我对 Java 很陌生,可以肯定地说我只是迈出了第一步。如果这个问题有点尴尬,我很抱歉。基本上我想知道解决我遇到的问题的最佳方法是什么。

我有一个抽象类BasePageHomePage它应该是从前者派生的。可以加载所有页面,因此在 上定义 load 方法是有意义的BasePage,但我希望该方法在这种情况下返回 HomePage 的类型和一般的 SubClass 类型。

从我了解到的情况来看,这似乎并不容易,我开始认为这可能是因为它的设计有缺陷。我还有一些对所有页面都有效的方法,其中之一是confirmAge, 因为无论你去哪个页面,你总是会遇到年龄限制,基本上你必须确认你已经 18 岁以上才能继续。因此,既然它是基本的东西,我相信它应该被编码到BasePage.

无论如何,无论我使用什么 - 抽象类或接口,我在返回类型方面都有同样的问题,我真的很想对所有从BasePage.

任何帮助,将不胜感激。

标签: java

解决方案


  1. 解决用例的最简单方法 - 依赖协变返回类型

例子:

public abstract class BasePage {

    public abstract BasePage load();
}

public class HomePage extends BasePage {

    @Override
    public HomePage load() {
        //...
        return this;
    }
}
  1. 如果除了返回类型之外还需要多态参数 - 使用泛型

例子:

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

    public abstract T load();
    public abstract void copyFrom(T another);
}

public class HomePage extends BasePage<HomePage> {

    @Override
    public HomePage load() {
        //...
        return this;
    }

    @Override
    public void copyFrom(HomePage another) {
        //...
    }
}

注意,<T>通用定义中的第二个可以省略,给出更短的

class BasePage <T extends BasePage>

在这种情况下,编译器会推断

class BasePage <T extends BasePage<?>>

这仍然适合您的一般情况


推荐阅读