在方法中实现带有附加参数的接口
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);
}
}
我有一个 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);
}
}