Java Abstract类子类的调用方法

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的类,负责与改造接口。这里是所有的核心方法。然后我有一个名为ConfigurableRouter的抽象类,它扩展了路由器,允许我配置路由器。现在我想我可以创建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;
}
这是可配置路由器方法的一个示例:

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()  {

}
}