在方法中实现带有附加参数的接口

Implementing an interface with additional parameters in a method

我有一个 class MyClass 实现了接口 IResp

public interface IResp {
    Response onResp(String a, String b)
            throws Throwable;
}
public class MyClass implements IResp {

    public onResp(String a, String b, String c) throws Throwable {
...
}

我需要 MyClass

onResp 方法中的附加 String c

现在,我知道我可以通过添加未实现的 onResp(String a, String b) throws Throwable{...} 或使 MyClass 成为抽象 class。

来实现这一点

由于我是 Java 的新手,我想请教一些更好的方法吗?

注意:我只能对class进行更改,不能创建或修改界面

你的意思是用一个空体来实现吗? 使用空主体实现该方法可能会产生问题。 假设有人出于某种原因在界面中创建了该方法。

假设一个函数获取接口作为参数。他们将调用哪种方法?两个参数版本一.

void someWork( IResp resp ) 
{
 resp.onResp("a","b");
}

现在,如果实际传递给 resp 的对象是一个具有空函数实现的 MyClass,它什么都不做。那是你想要的吗?

进行 class 抽象会比创建一个空的实现更好。这意味着有人会提供实现两个参数版本的发送。

如果你在MyClass中实现了一个sensible body的二参数版本,在MyClass中添加了一个三参数版本,但是你没有将其添加到接口中,那么f1等函数将无法使用它.

由此得出的结论是,您可能需要在界面中使用两个版本的 onResp。

如果实现接口 IResp,则必须实现带有两个参数的方法。但是您也可以使用 3 个参数定义第二个方法。例如:

    public class MyClass implements IResp {

        public void onResp(String a, String b) throws Throwable {
            onResp(a, b, null);
        }


        public void onResp(String a, String b, String c) throws Throwable {
            // your logic
        }
    }

如果您“实现”一个接口方法,并更改参数签名(如添加第三个字符串),则这不再是该接口的有效实现。你必须有一个像

这样的方法
public Response onResp(String a, String b) {
    // ...
}

在你的 MyClass.

I need the additional String c in onResp method of MyClass

接口 IResp 很可能存在,因为有 onResp() 方法的调用者,他们将提供两个字符串,而不是三个。如果您的 onResp() 代码在没有获取额外信息 (String c) 的情况下确实无法工作,那么您就有问题了。

你的提议都行不通(如果我理解正确的话):

  • 如果您只是添加一个空的 onResp(String a, String b) 方法,那么该方法将从外部调用,什么也不做 return。
  • 如果您将 MyClass 声明为抽象的,那么您将无法创建 MyClass 的实例,并且如果没有此 class 的实例,则什么都不会得到打电话。

一种(理论上的?)可能性是将接口方法更改为使用三个参数而不是两个参数,并修改接口的所有调用者以提供预期信息作为第三个参数。但我猜接口是固定的,你不能那样做。

如果您可以在所有 onResp() 调用中使用完全相同的 c 值,则可以提供额外的 String c,而不是在每个 onResp() 调用中,而是在时间,当您创建 MyClass 实例时,执行 new MyClass("abc"),假设“abc”是 c 的适当值。您的 class 应如下所示:

public class MyClass implements IResp {
    private String myConstantC;
    public MyClass(String c) {
        this.myConstantC = c;
    }
    privateResponse onResp(String a, String b, String c) {
        // your code
    }
    @Override
    public Response onResp(String a, String b) {
        return onResp(a, b, myConstantC);
    }
}

如果您不能忍受单个常量 c 值,但有机会以某种方式找出给定 onResp(a, b) 调用的必要 c 值,您可以做一些事情喜欢

public class MyClass implements IResp {
    privateResponse onResp(String a, String b, String c) {
        // your code
    }
    private String findTheCValue(String a, String b) {
        // your way to find and return the correct c value
    }
    @Override
    public Response onResp(String a, String b) {
        String c = findTheCValue(a, b);
        return onResp(a, b, c);
    }
}