3

以下のシナリオですべてのクラスのprint*()を呼び出す方法は、main()メソッド内でAのprintA()、BのprintB()、およびCのprintC()を呼び出すことを意味します。

class A
{
  public void printA(){System.out.println("A.printA()");}
}

class B extends A
{
    public void printB(){System.out.println("B.printB()");}
}

class C extends A
{
    public void printC(){System.out.println("C.printC()");}
}
class DemoInheritence
{
    public static void main(String[] str){
        printIt(new A());
        printIt(new B());
        printIt(new C());
    }
    public static void printIt(A a) {
        //Here I wants to call A's printA(), B's printB() and C's printC()
        //So how can I do this
    }
}
4

3 に答える 3

11

通常、次のようなことを行います。これはオーバーライドと呼ばれます。

class A
{
  public void print(){System.out.println("A.printA()");}
}

class B extends A
{
    public void print(){System.out.println("B.printB()");}
}

class C extends A
{
    public void print(){System.out.println("C.printC()");}
}
class DemoInheritence
{
    public static void main(String[] str){
        printIt(new A());
        printIt(new B());
        printIt(new C());
    }
    public static void printIt(A a) {
        a.print();
    }
}
于 2013-02-26T12:31:00.387 に答える
4

コードには、次のようなものを使用できます。

public static void printIt(A a) {
    if(a instanceof B) {
    ((B)a).printB();
    } else if(a instanceof C) {
       ((C)a).printC();
    } else {
      a.printA(); 
    }

}

しかし、これはちょっと間違っています。A の子クラスでメソッドをオーバーライドするか、すべてのクラスが実装するインターフェイスを作成し、そのインターフェイスをコードで使用する必要があります。

于 2013-02-26T12:33:13.110 に答える
0

リフレクション API を使用することもできますが、その場合はいくつかの仮定を立てる必要があります。少なくとも 2 つの可能性があります。

解決策 1. 印刷メソッドが「print[クラス名]」と呼ばれる場合、名前でメソッドを取得します。

public static void printIt(Object o) {
    Class objectClass = o.getClass();
    try {
        Method printMethod = objectClass.getMethod("print" + objectClass.getName());
        printMethod.invoke(o);
    } catch (NoSuchMethodException e) {
        throw new IllegalStateException("Method print"+objectClass.getName()+"() doesn't exist", e);
    } catch (InvocationTargetException e) {
        throw new IllegalStateException("Problem calling method print"+objectClass.getName()+"()", e);
    } catch (IllegalAccessException e) {
        throw new IllegalStateException("Method print"+objectClass.getName()+"() is not accessible", e);
    }
}

解決策 2. すべてのクラスが常に 1 つのメソッドを宣言する場合、渡されたオブジェクトのクラスの getDeclaredMethod によって返される最初のメソッドを取得します。

public static void printIt(Object o) {
    Class objectClass = o.getClass();
    try {
        Method printMethod = objectClass.getDeclaredMethods()[0];
        printMethod.invoke(o);
    } catch (InvocationTargetException e) {
        throw new IllegalStateException("Problem calling method print"+objectClass.getName()+"()", e);
    } catch (IllegalAccessException e) {
        throw new IllegalStateException("Method print"+objectClass.getName()+"() is not accessible", e);
    }
}
于 2013-02-26T13:57:48.357 に答える