我是Java的新手,可以肯定地说我只是迈出了第一步。因此,如果问题有点尴尬,我感到抱歉。 基本上,我想知道什么是解决我遇到的问题的最佳方法。
我有一个抽象类BasePage
和HomePage
,它们应该从前一个类派生。所有页面都可以加载,因此在BasePage
上定义load方法是有意义的,但是在这种情况下,我希望该方法返回HomePage的类型和通常的SubClass类型。
从我学到的知识来看,这似乎并不那么容易,我开始认为也许是因为这是一个有缺陷的设计。
我也有一些对所有页面都有效的方法,其中之一是confirmAge
,因为无论您进入哪个页面,您总是会受到年龄限制,基本上您必须确认自己是18岁以上继续。因此,由于它是基本内容,因此我认为应该将其编码到BasePage
中。
无论如何,无论我使用什么-抽象类或接口,返回类型都存在相同的问题,我真的很想在从BasePage
派生的所有类上强制执行一些接口。
任何帮助将不胜感激。
答案 0 :(得分:3)
示例:
public abstract class BasePage {
public abstract BasePage load();
}
public class HomePage extends BasePage {
@Override
public HomePage load() {
//...
return this;
}
}
示例:
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
请求。