我是 OOP 的新手,我想在 JAVA - Android 中使用来自扩展类的函数,但具有不同数量的参数。
据我所知,在 C# 中我可以执行以下操作:
主类
class Command {
protected int NrTokens
protected String cmd
protected String[] AnswerTokens
Command(String[] Tokens) {
AnswerTokens = Tokens
}
virtual int Parse()
virtual int Send()
}
并如下使用虚拟方法
class Command1 : Command{
protected int NrTokens=2;
protected String cmd="abc";
protected String AnswerTokens;
//
class ComandPing():Command(AnswerTokens);
public void Parse(){
if (AnswerTokens.size != NrTokens)
throw exception
//show on screen the status
}
Send() {
//todo
}
}
我在 Java 中试过这样
abstract class Command {
protected int NrTokens;
protected String cmd;
protected String[] AnswerTokens;
public void SetAnswerTokens(String Tokens[]){
AnswerTokens = Tokens;
}
abstract void Parse();
abstract void Send();
}
和
public class Command1 extends Command {
protected int NrTokens=2;
protected String cmd="PING";
protected String AnswerTokens;
public Command1(String Tokens[]){
}
@Override
void Parse(String b){
if (AnswerTokens.length()!= NrTokens)
{
}
}
@Override
void Send(int a) {
}
问题是如果我使用参数,它不是@Overriding
。我只需要来自某些子类的参数,例如 Command1、Command10,但不需要来自 Command5,因为我需要调用不带参数的 Send 和 Parse。
你能帮帮我吗?
最佳答案
如果您想覆盖 Java 中的方法,则不能更改参数计数、参数类型或顺序。
如果某些子类型需要一个参数并且需要多态性,那么您肯定需要一个参数。
我建议使用包装器类。 您可以使用新的 Java 8 可选类型或 Google Guavas 可选类型。或者,您也可以自己编写一个,如果这样可以提供额外的好处。
对于 Java 8 可选,请参阅:https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
对于 Guava 可选,请参阅:https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained
您可能也对空对象模式感兴趣。基本思想是使用一个对象,它可以表示一个空参数(类似于一个空列表而不是 null)。
关于参数数量可变的 Java "Virtual"方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29751999/