3

我有一个实现接口的类,其中一种方法称为 onClick。有没有办法实现接口想要的 onClick 但将其命名为其他名称?类似的东西(我正在编造这个):

public void AnyMethodNameIWant() implements Interface1.onClick

我要问的三个原因是:

  1. 查看方法签名并知道它来自接口会很好
  2. 为了避免像 onClick 这样的“通用”名称,界面可能需要我拥有
  3. 区分多个接口中相同的方法名

如果这是一个根本上“坏”的问题,我深表歉意,因为我是 Java 新手。

4

5 回答 5

6

不,你不能。接口必须由 Java 中的同名方法实现。

不过,您可以将@Override注释与接口实现一起使用(从 Java 6 开始),这有助于澄清这是一个不能随意重命名的方法。

第二个问题的一个选项可能是创建一个实现类,只是为了将调用转发到更具体的方法。您可能希望将其作为嵌套类甚至匿名类来执行。我不确定我通常会这样做。

编辑:看到第三个问题 - 不,如果您在 Java 中有两个具有相同方法签名的接口,则只能提供一个实现:(哦,如果您有两个具有相同签名但返回类型不同的接口,更糟糕的是你总是可以编写一个方法,Interface1 getInterface1()该方法返回一个匿名内部类的实例,将这些Interface1方法代理到“主”类上。

于 2011-10-01T10:35:29.643 回答
2

没有。

您唯一能做的就是添加一个实现接口并调用您的方法的影子方法。

public class MyClass implements Interface1 {
    public void AnyMethodNameIWant() { ...; }
    public void onClick() { AnyMethodNameIWant(); }
}
于 2011-10-01T10:36:30.657 回答
2

这两点

  • 为了避免像 onClick 这样的“通用”名称,界面可能需要我拥有
  • 区分多个接口中相同的方法名

通常通过使用适配器模式来解决。

interface IFoo {
    void onClick();
    void onChange();
}

class MyImpl {
    void doSomething(){
        // real code for onClick 
    }
    void doSomethingElse(){
        // real code for onChange
    }

    IFoo getFooAdapter(){
        return new IFoo() {
            @Override
            public void onClick() {
                doSomething();
            }

            @Override
            public void onChange() {
                doSomethingElse();
            }
        };
    }
}

基本上,您创建一个中间步骤,它将对任何接口方法的所有调用转发到实际实现。

命名和签名可能会有所不同。如果需要,您还可以为不同的接口提供不同的适配器(或者如果两个接口具有不同行为的竞争方法,则必须提供)。

如何分发适配器实例有很多可能性——在某些情况下,每次创建一个新实例可能并不明智。

当然,这种模式不是为了好玩或仅仅为了最小和干净的代码而实现的。但它可以解决实际问题。

于 2011-10-01T11:20:26.783 回答
1

您不能重命名该方法,但您可以定义这两个方法 (onClickanyMethodNameIWant) 并且onClick只需简单地调用您的其他方法。

@Override
public void onClick() {
    anyOtherMethodNameIWant();
}
于 2011-10-01T10:36:31.843 回答
1

当然,您可以使用指向相同实现的不同名称的其他方法来获得您想要的命名。

public void interfaceMethodA(){
   // some implementation here
}

public void AnyMethodNameIWant(){
    interfaceMethodA();
}
于 2011-10-01T10:38:39.050 回答