0

AdapterVersion (親クラス) のオブジェクト参照を使用して、(型キャストなしで) AdapterVer1 getAdaptObj1() の子クラス メソッドにアクセスするコードを次に示します。

abstract class AdapterVersion {

public abstract void getMObject();
public abstract void getCObject();

}

public class AdapterVer1 extends AdapterVersion {

@Override
public void getMObject() {
    System.out.println("AdapterVer1 Mont");

}

@Override
public void getCObject() {
    System.out.println("AdapterVer1 Conf");

}

public void getAdaptObj1() {

}

}

public class AdapterFactory {

public static void main(String []a){
    AdapterFactory adapterFactory= new AdapterFactory();
    AdapterVersion adpater = adapterFactory.getMyObject("ver1");
    adpater.getAdaptObj1();  // Unable to do that
            ((AdapterVer1)adpater).getAdaptObj1(); // Working but DONT WANT THIS

}

public AdapterVersion getMyObject(String version){
    if(version.equals("ver1")){
        return new AdapterVer1();
    }else{
        return new AdapterVer2(); // another declared class
    }
}

}
4

3 に答える 3

4

そんなことはできません。コンパイル時に、コンパイラは、呼び出したメソッドが、使用している参照のクラスでアクセス可能または可視であるかどうかをチェックするためです。

したがって、この場合、参照はParentクラスであるため、コンパイラはコードを正常にコンパイルするために、最初に親クラスでメソッド宣言を探します。

覚えて: -

コンパイラは参照型を考慮し、実行時に実際のオブジェクト型を考慮して、実際に呼び出すメソッドを決定します。

唯一のオプションは型キャストです。この場合、コンパイラは参照を型キャストしたクラスを調べます。他のオプションは、親クラスでその名前の抽象メソッドを宣言できることですが、あなたの質問から、明示的にそれをしていないようです。

于 2013-01-14T05:56:48.680 に答える
0

メソッド宣言を抽象クラスに移動する必要があります。

于 2013-01-14T05:59:18.470 に答える
0

Rohitはすでにそれを美しく説明しました。私の 2 セントを追加するには、最初にサブクラスの型を確認してから型キャストする必要があります。次に例を示します。

if(adapter instanceof Adapterver1) {
    ((AdapterVer1)adpater).getAdaptObj1();
}

このようにして、そのようなメソッドを宣言しない新しいサブクラスを処理しようとする場合、コードはより安全になります。

しかし、どのサブクラス メソッドを呼び出すかが既にわかっている場合、なぜスーパークラス参照からアクセスする必要があるのでしょうか。

于 2013-01-14T06:09:49.490 に答える