代码之家  ›  专栏  ›  技术社区  ›  Fabio Piunti

Abstract类子类的调用方法

  •  0
  • Fabio Piunti  · 技术社区  · 7 年前

    我有一个名为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());
    

    这就是路由器。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() ,这在第一个片段中。我不知道该怎么办。。尝试了不同的方式,但什么都没有。我该怎么办?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Stultuske    7 年前
    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. 即使所有作为参数传递的都是类型 常客 ,运行代码的JVM不(不能)知道这一点
    2. 其他人可以创建其他子类,并改变这种思路。
    3. 就JVM所知,它只是一个 ,以及所有 提供的是 sayName()

    假设您需要能够呼叫 方法,您有3个选项。

    1. 更改调用的方法。如果你需要 givesBusinessCard() 被称为,你知道这是一个 常客 ,所以你可以说:

      }

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

      公共抽象类人{

      抽象void givesBusinessCard();

      }

    public class LoudPerson extends Person {
    
      void sayName() {
        System.out.println("I yell my name!!");
      }
    
    void givesBusinessCard() throws UnsupportedOperationException {
      throw new UnsupportedOperationException("not needed here");
    }
    }
    

    或 公共类扩音器扩音器{

      void sayName() {
        System.out.println("I yell my name!!");
      }
    
    void givesBusinessCard()  {
    
    }
    }
    
    1. 把你的人投给 常客 在调用之前,请确保执行实例检查:

    公共无效处理人员(人){
    // .. if(普通人的人实例){ 正规人士p=(正规人士)人士; p、 givesBusinessCard(); } // .. }