2016-05-07 4 views
1

SOとウェブを検索した後、私はまだJavaで答えを出していません。それはかなり簡単です。オブジェクトのクラスを決定するためにswitchステートメントを使用できますか?

私は抽象クラスParentClassを持っています。クラスXとクラスYは両方ともParentClassから継承します。クラスDataInputDialog extends JDialogもあります。これは、クラスXインスタンスとクラスYインスタンスにデータを入力するためのユーザーインターフェイスを提供することを目的としています。 DataInputDialogクラスは以下のようになります。

public class DataInputDialog extends JDialog { 

    public DataInputDialog(ParentClass xOrY) { 
     //calls super constructor, makes basic components such as 
     // buttons and panels that are used in either X or Y data entry 

    } 
} 

今私はDataInputDialogに渡されたParentClassの種類を決定するであろうswitch文を持っているしたいと思います。しかし、私はどのようにそれを達成するための手がかりを持っていない。

switch (xOrY.getClass().getTypeName()) { 
    case X.class.getTypeName(); 
} 

やカップル他のバリエーションを、それは常にどちらかと言ってcase文のエラーを思い付く:私が試した、それは一定の文字列である必要があり、またはそれを整数に変換することができないこと。

xOrYXまたはYのインスタンスであるかどうかを判別するには、どのようにこのswitch文を使用しますか?

+6

なぜそれを知る必要がありますか?それらが親から派生し、親として渡している場合は、親のように扱う必要があります。 – ChiefTwoPencils

+1

おそらく他の何かをすることができますが、スイッチを使用しないでください。'if'と' instanceof'を使用してください。 –

+0

'xOrY instanceof X'または' xOrY.getClass()== X.class'を 'if ... else if ... 'と使用することができます。 –

答えて

7

スイッチを動作させるには、値がa primitive value, a String or an Enum valueである必要があります。 OOコードではswitch文はコードのようなものです。一般的に、多型を使用する機会がなかったことを示しています。

関数型言語では、あなたがしようとしていることを行うためにcase文を使用することができます。

JavaはOOですので、多態性を使用すると、よりクリーンなデザインになります。一方が他方のスーパーセットである場合

ポリモーフィズム は基本的に2つのオブジェクト/クラスがに考えることができると述べているオブジェクト指向の概念であり、同じを「BE」。すなわち、オブジェクト/クラスがIS-A関係を満たす場合。たとえば あなたはFastCarVintageCar両方がCarクラスであるため、IS-関係を満たすため、彼らはCarを呼び出すことができるコード内の任意の場所を使用することができますCarを拡張Carクラス、FastCarVintageCarクラスを持っている場合。 Car...accelerateが存在する場合、FastCar.accelerateが存在し、VintageCar.accelerateと異なる特性を持つ可能性があるので、コードを呼び出すと、コードはサブタイプを知る必要はなく、正しいaccelerateメソッドを呼び出すことになります。

+0

ここにこれがあります。初心者のOPの利益のために、私はあなたが多形性を利用する方法を詳しく述べるべきだと思います。 –

+0

@KevinKrumwiede非常に良い点は、私は最高の説明を与えるが、確かではないが、それを行ってみましょう。 – Gavin

+0

@Gavinだから、この状況で私はどんな場合でも同じであるいくつかのコードと一意のコードを持っています。似ている部分を達成するためにスーパークラスにメソッドを作成し、サブクラス内のユニークな部分だけをパッケージ化する方法を提案しますか? – corbfon

0

javaのスイッチケースには、コンパイル時定数が必要です。あなたの場合、クラス名はコンパイル時に一定ではありません。実行時にのみ決定されます。私はあなたがこれについて昔ながらの「if」の場合を書かなければならないと思います。

if(xOrY.getClass.getTypeName().equals(X.getClass.getTypeName()) 

一般的に言えば、実装の詳細を取得することは一般的には悪い考えです。インスタンス変数に実際に実装の詳細を追加することができます。

+1

if文を使用する場合、 'instanceof'はより簡単です – Mifeet

関連する問題