微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 如何在接口中重载方法?

如果我有这个界面
public interface someInterface {
  // method 1
  public String getValue(String arg1);
  // method 2
  public String getValue(String arg1,String arg2);
}

我希望能够将1或2个字符串传递给getValue方法,而不必在每个实现类中都覆盖它们.

public class SomeClass1 impelments someInterface 
{
 @Override
 public String getValue(String arg1);
}

public class SomeClass2 implements someInterface 
{
 @Override
 public String getValue(String arg1,String arg2);
}

这不起作用,因为SomeClass1需要实现方法2而SomeClass2需要实现方法1.

我坚持这样做吗?

public interface someInterface2 {
  public String getValue(String... args);
}

public class SomeClass3 implements someInterface2 
{
  @Override
  public String getValue(String... args) {
    if (args.length != 1) {
      throw IllegalArgumentException();
    }
    // code
  }
}

public class SomeClass4 implements someInterface2
{
  @Override
  public String getValue(String... args) {
    if (args.length != 2) {
      throw IllegalArgumentException();
     }
    // code
  }
}

someInterface2 someClass3 = new SomeClass3();
someInterface2 someClass4 = new SomeClass4();
String test1 = someClass3.getValue("String 1");
String test2 = someClass4.getValue("String 1,"String 2");

有没有更好的方法呢?

解决方法

接口用作该接口用户的契约:指定可用的方法(在所有实现中)以及如何调用它们.如果接口的两个实现需要不同的方法,那么该方法不应该是接口的一部分:
public interface Lookup {
}

public class MapLookup implements Lookup {
    public String getValue(String key) {
        //...
    }
}

public class GuavaLookup implements Lookup {
    public String getValue(String row,String column) {
        // ...
    }
}

在您的程序中,您将知道您使用的实现,因此您只需调用正确的函数

public class Program {
    private Lookup lookup = new MapLookup();

    public void printLookup(String key) {
        // I hardcoded lookup to be of type MapLookup,so I can cast:
        System.out.println(((MapLookup)lookup).getValue(key));
    }
}

替代方法

如果您的类程序更通用并使用依赖注入,您可能不知道您拥有哪种实现.然后,我会创建一个新的接口Key,它可以是任何一种键:

public interface Lookup {
    // ...

    public String getValue(Key key);
}

public interface Key {
}

public MapKey implements Key {
    private String key;
    // ...
}

public GuavaKey implements Key {
    private String row,column;
    // ...
}

程序中的依赖注入可能来自某些工厂实现.由于您无法知道使用哪种类型的查找,因此需要一个getValue合同.

public interface Factory {
    public Lookup getLookup();
    public Key getKey();
}

public class Program {
    private Lookup lookup;

    public Program(Factory factory) {
        lookup = factory.getLookup();
    }

    public void printLookup(Factory factory) {      
        System.out.println((lookup.getValue(factory.getKey()));
    }
}

原文地址:https://www.jb51.cc/java/125033.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐