我有一个名为Router的类,它负责与Retrofit连接。所以在这里是所有的核心方法。然后我有一个名为ConfigurableRouter的抽象类(扩展了Router),它允许我配置我的路由器。现在我希望我可以创建ConfigurabelRouter的子项(实际上它是一个抽象类),具有不同的defults值。
这是一个如何运作的例子:
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()
。我不知道我怎么做......尝试不同的方式,但没有。我该怎么办?
答案 0 :(得分:1)
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()
,这不会立即生效。
RegularPerson
类型,运行代码的JVM也不会(不能)知道这个Person
,所有Person
提供的是sayName()
方法。假设您需要能够调用givesBusinessCard()
方法,您有3种选择。
更改您调用的方法。如果您需要givesBusinessCard()
被呼叫,您知道它是RegularPerson
,因此您可以说:
public void handlePerson(RegularPerson person){
}
更改您的抽象类,在那里添加方法,并在LoudPerson
public abstract class Person {
abstract void sayName();
abstract void giveBusinessCard();
}
和
public class LoudPerson extends Person {
void sayName() {
System.out.println("I yell my name!!");
}
void givesBusinessCard() throws UnsupportedOperationException {
throw new UnsupportedOperationException("not needed here");
}
}
或 公共类LoudPerson扩展了人{
void sayName() {
System.out.println("I yell my name!!");
}
void givesBusinessCard() {
}
}
RegularPerson
,但请务必进行实例检查: public void handlePerson(Person person){
// ..
if(person instanceof RegularPerson){
RegularPerson p =(RegularPerson)人;
p.givesBusinessCard();
}
// ..
}