2016-10-01 14 views
1

初心者はこちらです。私の任務の一部は、着信電話が2つのカテゴリのどちらに属するかをユーザーに尋ねることです。Javaでオブジェクトを宣言することは可能ですか?

クラスCategoryAとクラスCategoryBは、前の割り当てで作成したPhoneCallクラスから継承されます。

私はこれやりたい:

String choice = null; 
    System.out.printf("Please enter a 'A' for Category A%n"); 
    System.out.printf("Please enter a 'B' for Category B%n"); 

    //[Input validation/exception handling stuff goes here] 

    switch(choice){ 
     case "A": 
      CategoryA objectName = new CategoryA(); 
      break; 
     case "B": 
      CategoryB objectName = new CategoryB(); 
      break; 
    } 

しかし、私は外でそれを使用することはできませんので、私はswitchステートメント内のobjectName宣言してい

  1. ので動作しませんもちろんのをそれ。
  2. 両方のオブジェクトが同じ名前を持っています(たとえ1つだけ宣言されていても)。

残りのオブジェクトはobjectNameを使用します。私は2つの異なるオブジェクト名を持っている必要がある場合、私はif/elseステートメントを持っているか、objectNameを使用したたびにステートメントを切り替える必要がありますか?私はオブジェクトを関数に渡すことさえできません。なぜなら、それはそのクラスまたは他のクラスのいずれかであるからです。私はここに欠けているいくつかの解決策はありますか?

答えて

3

のような簡単なif-else ifと読みやすくなり、共通のPhoneCallインターフェース

PhoneCall phoneCall = null; 
switch(choice){ 
    case "A": 
     phoneCall = new CategoryA(); 
     break; 
    case "B": 
     phoneCall = new CategoryB(); 
     break; 
} 
if (phoneCall != null) { 
    // ... 
} 

にプログラムを考えます多形性と呼ばれるものです。親クラス(またはインタフェース)のオブジェクトを宣言して、それをサブクラスとして初期化するのはそのときです。例えば

、あなたはこれをやって、サブクラスBおよびCとのインタフェースAを、持っている場合:彼らは親クラスの下に表示されているので

InterfaceA obj; 
if(x){ 
    obj = new ClassB(parameters); 
} else { 
    obj = new ClassC(parameters); 
} 

は、どちらかのクラスBまたはC を作成します。親クラスが持つメソッドだけを呼び出すことができます。クラスBは、ユニークな方法を持っている場合は、その型としてオブジェクトをキャストしない限り、他の言葉では、あなたはそれを呼び出すことはできません。

ClassB objB = (ClassB) obj; 
objB.uniqueMethod(); 

objがClassBのでない場合は、これはエラーをスローし、あなたのように、

if(obj instanceOf ClassB){ 
    ClassB objB = (ClassB) obj; 
    objB.uniqueMethod(); 
} 

あなたは、あなたがそれを行う前に、あなたはClassBのにOBJキャストできることを確認してその方法:objがClassBのであるかどうかを確認するために最初に必要。

これはインターフェイスまたはクラスのどちらでも動作します。

+0

ありがとう!これは完全に動作します! – StarSweeper

+1

キャストする前に 'if(objB instanceof ClassB)'を使うことができます(おそらくそうすべきです)。 –

4

はい、しかし、私は上記のあなたが使用したいので

PhoneCall phoneCall = null; 
if ("A".equals(choice)) { 
    phoneCall = new CategoryA(); 
} else if ("B".equals(choice)) { 
    phoneCall = new CategoryB(); 
} 
+0

私がそうすると、各クラスに固有のメソッドで「メソッドを解決できません」というエラーが発生します。私は間違って何をしていますか? – StarSweeper

+0

共通インタフェースを介して呼び出すことのできるメソッドを作成しません。 –

関連する問題