gpt4 book ai didi

java - 我将如何重载接口(interface)中的方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:35:54 26 4
gpt4 key购买 nike

如果我有这个界面

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");

有更好的方法吗?

最佳答案

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

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

替代方法

如果你的类 Program 更通用并且使用依赖注入(inject),你可能不知道你有哪个实现。然后,我会创建一个新接口(interface) 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;
// ...
}

您程序中的依赖注入(inject)可能来自某些工厂实现。由于您无法知道您使用的是哪种类型的查找,因此您需要一个用于 getValue 的契约(Contract)。

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()));
}
}

关于java - 我将如何重载接口(interface)中的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15843645/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com