Java 通过声明新方法抽象 class 继承
Java abstract class inheritance by declaring new methods
在我的 android 项目中,我有一个摘要 class 请求
package Managers;
import java.util.HashMap;
public abstract class Request {
public interface Completion {
void execute(HashMap<String, Object> result);
}
protected Completion completion;
protected HashMap<String, Object> requestResult;
public void setCompletion(Completion newCompletion) {
completion = newCompletion;
if (requestResult != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}
在我的 RequestsManager Class 中,我已经像这样实例化了它
public static Request numberAvailabilityCheck = new Request() {
public String isSuccess = "isSuccess";
public String result = "result";
public void sendRequest(String number) {
new java.util.Timer().schedule(new java.util.TimerTask() {
@Override
public void run() {
requestResult = new HashMap<String, Object>();
requestResult.put(isSuccess, true);
requestResult.put(result, true);
if (completion != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}, 5000);
};
};
在我的 MainFragment class 我需要像这样使用 numberAvailabilityCheck
private View.OnClickListener checkEventListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestsManager.numberAvailabilityCheck.setCompletion(numberAvailabilityCheckCompletion);
ViewRelatedUtils.closeKeyboard(getActivity());
isProcessingCheckNumber = true;
showProcessing();
RequestsManager.numberAvailabilityCheck.sendRequest(numberField.getText());
}
};
但是编译器在 MainFragment 中看不到 RequestsManager.numberAvailabilityCheck.sendRequest 方法。为什么编译器看不到它?当我像这样在 RequestsManager 中声明 public 方法 sendRequest 时,编译器理解什么?我怎样才能让编译器看到它?
请注意,您的代码可以毫无问题地调用方法 setCompletion()!
那个方法是在你的基础上定义的class。另一个方法只在你的匿名内部 class 实例化的范围内定义!因此编译器不会 "see" 它并阻止您调用它!
请注意:如果您能以某种方式将该字段转换为没有类型声明的局部变量(通过使用 Java10 的新 var 关键字),您的代码将起作用:因为编译器可以推断出事实上,你添加了那个方法。但是通过将该对象声明为 Request 类型,编译器只能告诉您该方法不存在。
但是使用 var 并不是一个好的方法,相反的解决方案可能是:为您的 class 请求添加一个 sendRequest() 的抽象方法!如果那不可能,那么请考虑不使用单个抽象基 class,为什么不使用额外的抽象 class 扩展你的基 class,每个都提供稍微不同的发送方法。
感谢所有向我描述为什么编译器看不到方法的人。我找到了一个解决方案,我认为这是对我来说最舒适的解决方案。在 RequestsManager 中,我声明了一个 public class NumberAvailabilityCheck 扩展了 Request 和 public 该 class numberAvailabilityCheck.
的静态成员
public static class NumberAvailabilityCheck extends Request {
public String isSuccess = "isSuccess";
public String result = "result";
public void sendRequest(String number) {
new java.util.Timer().schedule(new java.util.TimerTask() {
@Override
public void run() {
requestResult = new HashMap<String, Object>();
requestResult.put(isSuccess, true);
requestResult.put(result, true);
if (completion != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}, 5000);
};
};
public static NumberAvailabilityCheck numberAvailabilityCheck = new NumberAvailabilityCheck();
请注意,NumberAvailabilityCheck 不能声明为私有。
在我的 android 项目中,我有一个摘要 class 请求
package Managers;
import java.util.HashMap;
public abstract class Request {
public interface Completion {
void execute(HashMap<String, Object> result);
}
protected Completion completion;
protected HashMap<String, Object> requestResult;
public void setCompletion(Completion newCompletion) {
completion = newCompletion;
if (requestResult != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}
在我的 RequestsManager Class 中,我已经像这样实例化了它
public static Request numberAvailabilityCheck = new Request() {
public String isSuccess = "isSuccess";
public String result = "result";
public void sendRequest(String number) {
new java.util.Timer().schedule(new java.util.TimerTask() {
@Override
public void run() {
requestResult = new HashMap<String, Object>();
requestResult.put(isSuccess, true);
requestResult.put(result, true);
if (completion != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}, 5000);
};
};
在我的 MainFragment class 我需要像这样使用 numberAvailabilityCheck
private View.OnClickListener checkEventListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
RequestsManager.numberAvailabilityCheck.setCompletion(numberAvailabilityCheckCompletion);
ViewRelatedUtils.closeKeyboard(getActivity());
isProcessingCheckNumber = true;
showProcessing();
RequestsManager.numberAvailabilityCheck.sendRequest(numberField.getText());
}
};
但是编译器在 MainFragment 中看不到 RequestsManager.numberAvailabilityCheck.sendRequest 方法。为什么编译器看不到它?当我像这样在 RequestsManager 中声明 public 方法 sendRequest 时,编译器理解什么?我怎样才能让编译器看到它?
请注意,您的代码可以毫无问题地调用方法 setCompletion()!
那个方法是在你的基础上定义的class。另一个方法只在你的匿名内部 class 实例化的范围内定义!因此编译器不会 "see" 它并阻止您调用它!
请注意:如果您能以某种方式将该字段转换为没有类型声明的局部变量(通过使用 Java10 的新 var 关键字),您的代码将起作用:因为编译器可以推断出事实上,你添加了那个方法。但是通过将该对象声明为 Request 类型,编译器只能告诉您该方法不存在。
但是使用 var 并不是一个好的方法,相反的解决方案可能是:为您的 class 请求添加一个 sendRequest() 的抽象方法!如果那不可能,那么请考虑不使用单个抽象基 class,为什么不使用额外的抽象 class 扩展你的基 class,每个都提供稍微不同的发送方法。
感谢所有向我描述为什么编译器看不到方法的人。我找到了一个解决方案,我认为这是对我来说最舒适的解决方案。在 RequestsManager 中,我声明了一个 public class NumberAvailabilityCheck 扩展了 Request 和 public 该 class numberAvailabilityCheck.
的静态成员public static class NumberAvailabilityCheck extends Request {
public String isSuccess = "isSuccess";
public String result = "result";
public void sendRequest(String number) {
new java.util.Timer().schedule(new java.util.TimerTask() {
@Override
public void run() {
requestResult = new HashMap<String, Object>();
requestResult.put(isSuccess, true);
requestResult.put(result, true);
if (completion != null) {
completion.execute(requestResult);
requestResult = null;
}
}
}, 5000);
};
};
public static NumberAvailabilityCheck numberAvailabilityCheck = new NumberAvailabilityCheck();
请注意,NumberAvailabilityCheck 不能声明为私有。