gpt4 book ai didi

java - 调用抽象类子类的方法

转载 作者:行者123 更新时间:2023-12-02 12:01:41 24 4
gpt4 key购买 nike

我有一个名为 Router 的类,负责与 Retrofit 进行交互。所以这里是所有的核心方法。然后我有一个名为 ConfigurableRouter (扩展 Router)的抽象类,它允许我配置我的路由器。现在我希望我可以创建具有不同默认值的 ConfigurabelRouter 的子级(实际上它是一个抽象类)。

这是一个如何工作的示例:

Router.configure(M_Rout.class)
.setPath("close-pi")
.setParams(params)
.setRequestMethod(Router.RequestMethod.POST)
.setIsAuthRequested(true)
.setCallback(new RequestResponse() {
@Override
protected void onSuccess(HashMap<String, String> responseItems) {}

@Override
protected void onGeneralError(int responseCode) {}

@Override
public void onFailure() {}
})
.sendRequest(getActivity());

这就是 Router.configure() 方法的工作原理:

public static ConfigurableRouter configure(Class<? extends ConfigurableRouter> aClass){
ConfigurableRouter configurableRouter = null;
try {
configurableRouter = aClass.newInstance();
//obj is a newly created object of the passed in type
} catch (Exception ignored) { }
return configurableRouter;
}

这是 ConfigurableRouter 方法的示例:

public ConfigurableRouter setParams(HashMap<Stthring, Object> params){
super.setRouterParams(params);
return this;
}

这是 M_Router 类:

public class M_Rout extends ConfigurableRouter {
@Override
public String setBasepath() {
return "www.xxxxxxx.xx/";
}

@Override
public String setInDebigBasePath() {
return "www.debugxxxxxxx.xx/";
}

@Override
public boolean isDebugging() {
return false;
}

@Override
public RequestMethod setDefultRequestMethod() {
return RequestMethod.POST;
}

@Override
public RequestResponse setDefultResponse() {
return new RequestResponse() {
@Override
protected void onSuccess(HashMap<String, String> responseItems) {
Log.d("RouterLog", "PigSUCSESSSpig");
}

@Override
protected void onGeneralError(int responseCode) {

}

@Override
public void onFailure() {

}
};
}

@Override
public ConfigurableRouter setAuthToken(String authToken) {
return super.setAuthToken("tokenExample");
}

public void setIsAuthRequested(boolean b){
//
}
}

现在我的问题是我无法访问 M_Router 类中的非重写方法,例如第一个片段中的 setIsAuthRequested() 。我不知道我该怎么做......尝试了不同的方式,但一无所获。我该怎么办?

最佳答案

public abstract class Person {

abstract void sayName();

}

它有两个实现:

public class LoudPerson extends Person {

void sayName() {
System.out.println("I yell my name!!");
}

}

public class RegularPerson extends Person {

void sayName() {
System.out.println("I will say my name");
}

void givesBusinessCard() {
// whatever
}

}

现在,如果您创建这样的方法:

public void handlePerson(Person person) {

}

您将能够对其调用 sayName() 方法,因为无论 Person 是什么类型,它总是有一个 的实现>sayName()

现在,假设您想要传递 RegularPerson 的实例,并调用 givesBusinessCard(),这不会立即起作用。

  1. 即使您作为参数传递的所有参数都是 RegularPerson 类型,运行代码的 JVM 也不会(无法)知道这一点
  2. 其他人可以创建其他子类,并改变这种思路。
  3. 就 JVM 所知,它只是一个 Person,而 Person 提供的只是 sayName() 方法。

假设您需要能够调用 givesBusinessCard() 方法,您有 3 个选项。

  1. 更改您调用的方法。如果您需要调用 givesBusinessCard(),您知道它是 RegularPerson,因此您可以说:

    公共(public)无效handlePerson(RegularPerson人){

    }

  2. 更改您的抽象类,在其中添加方法,并在 LoudPerson 中提供该方法的失败实现或空实现

    公共(public)抽象类Person{

    抽象无效sayName();

    抽象无效给BusinessCard();

    }

public class LoudPerson extends Person {

void sayName() {
System.out.println("I yell my name!!");
}

void givesBusinessCard() throws UnsupportedOperationException {
throw new UnsupportedOperationException("not needed here");
}
}

或者 公共(public)类 LoudPerson 扩展了 Person {

  void sayName() {
System.out.println("I yell my name!!");
}

void givesBusinessCard() {

}
}
  • 在调用之前将您的人员强制转换为 RegularPerson,但请务必进行实例检查:
  • public void handlePerson(Person person) {
    //.. if (普通人的人实例) { 普通人 p = (普通人)人; p.givesBusinessCard(); } //..}

    关于java - 调用抽象类子类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47198016/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com