简体   繁体   English

具有可变数量参数的Java“虚拟”方法

[英]Java “Virtual” method with variable number of parameters

I am new to OOP and I want to use functions from an extended class, but with different numbers of parameters, in JAVA - Android. 我是OOP的新手,我希望在JAVA - Android中使用扩展类中的函数,但使用不同数量的参数。

As far as I remember in C# i can do the following: 据我记得在C#中我可以做到以下几点:

Main Class 主类

    class Command {
     protected int NrTokens
     protected String cmd
     protected String[] AnswerTokens

     Command(String[] Tokens) { 
        AnswerTokens = Tokens   
    }
     virtual int Parse()
     virtual int Send()
}

And use the virtual Methods as follows 并使用虚拟方法如下

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
}
}

I tried in Java like this 我这样用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();



}

And

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

    }

The problem is that it is not @Overriding if i use parameters. 问题是,如果我使用参数,它不是@Overriding I only need parameters from some sub classes, like Command1, Command10, but NOT from Command5, from witch I need to call Send and Parse without parameters. 我只需要来自某些子类的参数,比如Command1,Command10,但不需要来自Command5,我需要调用不带参数的Send和Parse。

Can you help me? 你能帮助我吗?

You may not change the parameter count, their types or order if you want to override a method in Java. 如果要在Java中覆盖方法,则不能更改参数计数,类型或顺序。

You definitely need a parameter here if some subtypes need one and polymorphism is required. 如果某些子类型需要一个并且需要多态,那么你肯定需要一个参数。

I recommend using a wrapper class. 我建议使用包装类。 You could use the new Java 8 Optional type or Google Guavas Optional type. 您可以使用新的Java 8 Optional类型或Google Guavas Optional类型。 Alternatively, you could write one yourself if that provides additional benefit. 或者,如果可以提供额外的好处,您可以自己写一个。

For Java 8 Optional see: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html 对于Java 8可选请参阅: https//docs.oracle.com/javase/8/docs/api/java/util/Optional.html

For Guava Optional see: https://code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained 对于Guava可选请参阅: https//code.google.com/p/guava-libraries/wiki/UsingAndAvoidingNullExplained

The Null Object pattern may also be of interest for you. Null对象模式也可能对您感兴趣。 The basic idea is to use an Object which may represent an empty parameter (similiar to an empty list rather than null). 基本思想是使用一个Object,它可以表示一个空参数(类似于空列表而不是null)。

See: http://en.wikipedia.org/wiki/Null_Object_pattern 请参阅: http//en.wikipedia.org/wiki/Null_Object_pattern

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM