0

私はある種の特定の問題を抱えています。

public interface A {
}

//------------------------------

public class B implements A {

    static int countx = 0;
}

//----------------------------------
public class C implements A {

    static int county = 0;
}

//----------------------------------

public class Arc {

    public A from;
    public A to;

//========================================

そして今、私はオブジェクトa(Arcのインスタンス)を持っていて、それがBまたはCのインスタンスであるかどうかを調べ、属性countXまたはcountY(a.from.countXのようなstg)に到達したいのですか?:)

4

6 に答える 6

1

使用instanceofと型キャスト:

if (a.from instanceof B) {
    B b = (B)a.from;
    b.countx;
}

編集:しかし、あなたは本当にそのようなものを必要とすべきではありません!そうした場合、おそらくこのような醜いコードを生成しないように再設計することができます。

たとえば、またはを返すことで、インターフェイスAにメソッドgetCount()を持たせ、クラスBとCにこれらを実装させることができます。countxcounty

Edit2:あなたcountxcountyメンバーがいることに気づきましたstatic!どうしてそうするか?staticつまり、クラスのインスタンスではなく、クラスオブジェクト(「クラスメンバー」)に「作用」します。これは、または;を介してこれらの変数にアクセスすることにより、どこからでもこれらの変数にアクセスして変更できることを意味します。クラスの複数のインスタンスが同じものを共有するため、おそらくこれは望ましくありません。A.countxB.countyAcountx

于 2012-04-14T16:59:03.700 に答える
1

現在の設計は、OOPの観点からは良くありません。カプセル化とポリモーフィズムが必要です。OOP言語では、オブジェクトのタイプを明示的にチェックするのではなく、動的ディスパッチを介して自動的に行われるように調整します。したがって、BとCの両方から必要なデータが何であれ、そのデータを取得するメソッドをインターフェイスAに追加し、それに応じてBとCにメソッドを実装します。また、カプセル化を壊すパブリックインスタンスフィールドは使用しないでください。

于 2012-04-14T16:59:27.690 に答える
1

instanceof を使用してこの問題を解決できると思います

のように

if(a instanceof B) return a.countx
if(a instanceof C) return a.county
于 2012-04-14T16:58:08.833 に答える
0

このように考えてください:

BとCを区別したい理由は何ですか? 手術ですか?もしそうなら、B対Cでそれらの操作を適切に実装し、残りは動的ディスパッチに任せてください。

interface Operation { 
    public Result operate(String[] args);
}

class A implements Operation { 

    @Override
    public Result operate(String[] args) { 
        //I need to do some special calculations for an A...           
        for(String arg : args) { 

        }
        .
        .
        .
    }
}

class B implements Operation { 

    @Override
    public Result operate(String[] args) { 
        //i know this does nothing so return the empty result
        return Result.EMPTY;
    }
}

使用する誘惑に抵抗しますinstanceof。ほとんどの場合、それは必要ありません-そしてそれはOOではありません。

于 2012-04-14T17:25:15.237 に答える
0

Arc のインスタンスであるオブジェクトがある場合、それはどのようにして B または C のインスタンスでもあるのでしょうか? あなたのコードには欠陥があり、再構築が必要だと思います。たとえば、Tudor が指摘したように、「階層内のクラス Arc と A の間に関係はありません」。

于 2012-04-14T16:58:29.633 に答える
0

クラスに関する情報が必要な場合:

getClass().getSuperclass()

よろしく、エルワルド

于 2012-04-14T17:16:13.673 に答える