如何在将返回类型Subclass的超类中创建方法

时间:2019-01-07 10:59:00

标签: java

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

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

从我学到的知识来看,这似乎并不那么容易,我开始认为也许是因为这是一个有缺陷的设计。 我也有一些对所有页面都有效的方法,其中之一是confirmAge,因为无论您进入哪个页面,您总是会受到年龄限制,基本上您必须确认自己是18岁以上继续。因此,由于它是基本内容,因此我认为应该将其编码到BasePage中。

无论如何,无论我使用什么-抽象类或接口,返回类型都存在相同的问题,我真的很想在从BasePage派生的所有类上强制执行一些接口。

任何帮助将不胜感激。

5 个答案:

答案 0 :(得分:3)

  1. 解决用例的最简单方法-依靠covariant return types

示例:

public abstract class BasePage {

    public abstract BasePage load();
}

public class HomePage extends BasePage {

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

示例:

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<?>>

仍然适合您的一般情况

答案 1 :(得分:2)

您可以将实际的Type添加为BasePage的类型参数:

public abstract class BasePage<T extends BasePage<?>> {
    public abstract T load();
}


public class HomePage extends BasePage<HomePage> {

    @Override
    public HomePage load() {
        return new HomePage();
    }
}

答案 2 :(得分:1)

一种解决方案是使用泛型:

public abstract class SuperClass<T extends SuperClass<T>> {
    protected abstract T someMethod();
}

public class SubClass extends SuperClass<SubClass> {
    protected SubClass someMethod() {
        return this;
    }
}

答案 3 :(得分:0)

泛型是此处的最佳选择。您可以在这里输入界面。这是一个示例:

public interface Service<T> {
   T execute();
}

public class MyService implements Service<String> {

    private final String input1;
    private final int input2;

    public MyService(String input1, int input2) {
       this.input1 = input1;
       this.input2 = input2;
    }

    @Override
    public String execute() {
        return String.format("'%s%d'", input1, input2);
    }
}

答案 4 :(得分:0)

我将这样设计:创建一个抽象类BaseClass并保留未实现的loadPage方法(抽象方法)。现在,extend中的任何BaseClass类都可以拥有自己的loadPage实现。

或者,在基类中编写一个基本的loadPage方法。此方法应包含诸如发出GET请求之类的操作,该操作对于其对象需要加载页面的所有类都是通用的。然后,在基类的子类中,创建类似homePageLoader的方法。此方法可以在基类中调用pageLoader发出GET请求。