6

假设我有两个自定义类和一个方法,如下所示:

class A {
  public void think() {
    // do stuff
  }
}

class B {
  public void think() {
    // do other stuff
  }
}

Class C {
  public void processStuff(A thinker) {
    thinker.think();
  }
}

有没有办法写成processStuff()这样(只是说明):

public void processStuff({A || B} thinker) {...}

或者,换句话说,有没有办法用一个参数来编写一个接受多种类型的方法,以避免processStuff()多次键入该方法?

4

5 回答 5

14

在接口中定义您想要的行为,拥有AB实现接口,并声明您processStuff将接口实例作为参数。

interface Thinker {
    public void think();
}

class A implements Thinker {
    public void think() { . . .}
}

class B implements Thinker {
    public void think() { . . .}
}

class C {
    public void processStuff(Thinker thinker) {
        thinker.think();
    }
}
于 2012-12-20T19:16:50.230 回答
5

这种情况下,最简单的就是定义一个接口

interface Thinker {
   public void think();
}

然后让你的类实现它:

class A implements Thinker {
  public void think() {
    // do stuff
  }
}

并将其用作参数类型:

Class C {
  public void processStuff(Thinker t) {
    t.think();
  }
}
于 2012-12-20T19:17:15.677 回答
5

定义Thinker为接口:

public interface Thinker
{
    public void think();
}

然后有类AB实现它:

public class A
implements Thinker

最后,定义processStuff()以 aThinker作为参数。

于 2012-12-20T19:17:45.303 回答
1

您可以创建一个包含该think方法的通用接口,并让AB实现它。

或者你可以重载processStuff()并有两个实现,每个实现一个类。

于 2012-12-20T19:17:37.667 回答
1

在这种情况下,您可以简单地使用多态性。为此,您需要重载您的方法——创建具有相同名称但参数类型不同的方法。java 不检查方法名称,它检查方法签名(方法名称+参数+返回类型),例如:

public class foo
{
       public int add(int a, int b)
       {
            int sum = a+b ;
            return sum ; 
       }


       public String add(String a, String b)
       {
            String sum = a+b ;
            return sum ; 
       }

       public static void main(String args[])
       {
            foo f = new foo() ;
            System.out.printf("%s\n",f.add("alpha","bet));
            System.out.printf("%d", f.add(1,2);
       }


 }

此代码应返回

alphabet
3

如您所见,两个方法签名不同,因此没有错误。请注意,这只是可以做的一个例子。

于 2012-12-20T19:29:34.990 回答