Java 具有不同方法参数的接口

Java 具有不同方法参数的接口,java,class,interface,Java,Class,Interface,我想声明一个接口可用于几个类 此类具有不同参数的方法 接口: public interface Operation { public int Add(); } A类: public class CLASSA implement Operation{ public int Add(int id,String name); } B类: public class CLASSB implement Operation{ public int Add(String nam

我想声明一个接口可用于几个类
此类具有不同参数的方法

接口:

public interface Operation {

public int Add();

}
A类:

public class CLASSA implement Operation{

     public int Add(int id,String name);

}
B类:

public class CLASSB implement Operation{

     public int Add(String name);

}

如何实现此接口?

您可以创建一个操作数对象

public interface Operation {

public int Add(Operand o);

}


你不能这样做。如果接口操作是您的(不是预定义的或其他人的),请在其中重载抽象方法。这是唯一的方法。

最好尝试一下:

public interface Operation {
    public int add();
}


public class SimpleOperation implements Operation {

    @Override
    public int add() {
        return 0;
    }

    public int add(int id, String name) {
        return id;
    }

}
使用时:

Operation op = new SimpleOperation();
op.add(); // Valid
op.add(2, "two"); // Invalid
基本上,尽管可以将该方法添加到类中,但如果接口中不存在该方法,那么如果调用该方法的实例是该接口的实例,则不能调用该方法

但是,这是有效的,因为实例属于类
SimpleOperation
,该类声明了重载方法:

SimpleOperation op = new SimpleOperation();
op.add(); // Valid
op.add(2, "two"); // Also valid

然而,这降低了接口的实用性。如果您热衷于重载这些方法,请考虑使用抽象的超类,使用定义的方法并在子类中重写它们。或者,将原始方法和重载方法都添加到接口中。

在这种情况下,您使用的不是同一个接口,但可以创建一个遗传系统,其中自动插入一些参数:

public class CLASSA{
     public int Add(int id,String name){
         //something
     }
}

public class CLASSB extends CLASSA{
     public int Add(String name){
         super.Add(this.FIXED_ID, name);
         //something
     }
}

public class OPERATION extends CLASSA{
     public int Add(){
         super.Add(this.FIXED_ID, this.FIXED_NAME);
         //something
     }
}

这是一个坏主意,它违反了OO设计和接口背后的理念。接口被认为是从实现中抽象出方法调用的一种方式

我的建议是在接口中使用带有两个参数的方法,不要在CLASSB中使用ID参数,或者在接口中不要使用add方法,只在每个类中使用不同的版本。

两种解决方案
在接口中定义两种方法之一:

public interface Operation {

public int addName(String name);
public int addIdName(int id, String name);

}
或者使用泛型参数

public interface Operation {

    public int add(HashMap<String,String> keyValueParams);
}
公共接口操作{
public int add(HashMap keyValueParams);
}

但对于操作,这应该是不同的。

关于上述答案,有几点值得一提:

  • 具有多个函数实现(每组参数一个)并与之交互违反了
  • 使类忽略未使用的参数违反了

我的建议是实现类似模式的东西。将命令实现与其实现分离正是其目的

更好的方法是将参数声明为类中的字段。现在将其作为参数传递给构造函数,因此现在在创建类的新实例时指定它。

如果它们有不同的参数,则它们不使用相同的接口!我认为这个问题没有合适的答案,因为这不是接口的正确用法。但是,如果你提供了信息,你为什么要这样做,可能会有另一种方法来解决你的问题。就目前情况而言,这不能用明智的方式来回答。请描述您为什么需要这样做(即,您打算如何使用此假设接口)。现在您可以使用此接口并模拟不同的参数。没有其他方法可以这样做,因为否则,您将需要不同的接口。这提供了灵活性,但需要额外的类型检查,但在某些情况下,这可能是一个必要的折衷,因此在我看来,这是一个有用的解决方案。它还意味着您可以在接口的实现中对操作数进行子类化,并为该子类添加逻辑,从而允许传递任何类型的参数。但是请注意,
操作数
应该读取
操作数
,如果这确实是类的名称。但是现在,您的接口没有用,因为这里没有定义Add(int,String)。。。另外,java约定告诉您使用小写方法名add()@cIph3r您完全正确,没有注意到。OP也不应该在类名上使用大写。但是请注意,通常最好在子类中添加额外的详细信息,而不要删除它们,因为任何修改都会减少所需的维护。链接已过期,但quick google for command模式应该足够懒惰的人使用Wikipedia:
public interface Operation {

    public int add(HashMap<String,String> keyValueParams);
}