Java Abstract类子类的调用方法
我有一个名为Router的类,负责与改造接口。这里是所有的核心方法。然后我有一个名为ConfigurableRouter的抽象类,它扩展了路由器,允许我配置路由器。现在我想我可以创建ConfigurabelRouter的子类,实际上它是一个具有不同defults值的抽象类 这是一个如何工作的示例:Java Abstract类子类的调用方法,java,class,abstract-class,parent-child,Java,Class,Abstract Class,Parent Child,我有一个名为Router的类,负责与改造接口。这里是所有的核心方法。然后我有一个名为ConfigurableRouter的抽象类,它扩展了路由器,允许我配置路由器。现在我想我可以创建ConfigurabelRouter的子类,实际上它是一个具有不同defults值的抽象类 这是一个如何工作的示例: Router.configure(M_Rout.class) .setPath("close-pi") .setParams(params)
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;
}
这是可配置路由器方法的一个示例:
public ConfigurableRouter setParams(HashMap<Stthring, Object> params){
super.setRouterParams(params);
return this;
}
这是M_路由器类:
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 void handlePerson(Person person) {
}
您将能够在其上调用sayName方法,因为无论它是什么类型的人,它都将始终具有sayName的实现
现在,假设您想要传递一个RegularPerson实例,并调用GivesBusiness Card,这不会立即起作用
即使所有作为参数传递的都是RegularPerson类型,运行代码的JVM也不知道这一点
其他人可以创建其他子类,并改变这种思路。
就JVM所知,它只是一个Person,Person提供的只是sayName方法。
假设您需要能够调用givesBusinessCard方法,您有3个选项
改变你调用的方法。如果你需要给GivesBusiness Card打电话,你知道这是一个常客,所以你可以说:
公共无效处理人{
}
更改抽象类,在其中添加方法,并在LoudPerson中提供失败的或空的方法实现
公共抽象类人物{
void sayName() {
System.out.println("I yell my name!!");
}
void givesBusinessCard() {
}
}
抽象名称
摘要作废商业名片
}
及
或
公共类扩音器扩音器{
void sayName() {
System.out.println("I yell my name!!");
}
void givesBusinessCard() {
}
}
在调用之前将您的人员强制转换为RegularPerson,但请确保执行实例检查:
公共无效处理人{
// ..
如果是普通人的人实例{
正规人员p=正规人员;
p、 赠送商务卡;
}
// ..
}如果您将其声明为父类的类型,则仅限于父类提供的功能。是的,我知道..但在一个项目中,我可以有不同的类,如M_Router,具有所有不同的defult值,而不仅仅是一次,所以不要在抽象方法中声明更多的方法。意思是:所以不要将其声明为abstrac的类型t类,或者在抽象类中声明更多的方法是的,我理解了。那么这是唯一的解决方案吗?我无能为力?这是一个完美的解释,谢谢。我遵循你在评论中给我的建议
void sayName() {
System.out.println("I yell my name!!");
}
void givesBusinessCard() {
}
}