2017-06-11 11 views
2

私は学校のプロジェクトで取り組んでいます。私は抽象クラスを作成して以来、 "manager"と "ticket salesmen"の2種類のオブジェクトを含むArrayListを作成する必要があります。私はArrayList型の "user"を作成し、そこに "manager"と "ticket salesmen"の両方を格納しましたが、どのようにこれらの2つの型にアクセスできますか?私は "ユーザー"としてリストの各要素にアクセスすることができ、 "マネージャ"または "チケットセールスマン"ではなく、抽象クラスにある属性を取得できます。これらの2つのオブジェクトの属性を取得する方法と、どのようなクラスのインスタンスですか?JavaのArrayListに2種類のオブジェクトを格納する

+1

そのはるかに良い説明 – Antoniossss

+0

よりも実際のコードを貼り付ける私はあなたがtoghether両方のタイプを維持している理由を手始めを求めると思いますか?彼らの共通点は何がありますか ? – Antoniossss

+0

このソリューションのリンクは次のとおりです。https://stackoverflow.com/a/34437757/3095589 –

答えて

1

あなたはあなたが最初のタイプは、サブクラスであるかどうか確認する必要があり、ユーザ

User obj = new Manager(); 
User obj2 = new SalesMan(); 
System.out.println(obj instanceof Manager); // true 
System.out.println(obj instanceof SalesMan);// false 

System.out.println(obj2 instanceof Manager); // false 
System.out.println(obj2 instanceof SalesMan);// true 
+1

...キャストはアプリケーションがうまく設計されていない場合にのみ必要です。 –

+1

私は同意します。可能であれば、instanceOfの使用は避けてください。 –

+0

@HenryMaathuisなぜinstanceofを避けるべきですか? –

0

の実際の型を識別するために、instanceof演算子を使用することができます。これは、instanceOf演算子を使用して行うことができます。サブクラスの型を決定したら、ユーザーをその特定のサブクラスにキャストする必要があります。キャスト後、その特定のサブクラスの機能にアクセスできます。

ただし、可能な場合はinstanceOfの使用を避ける必要があることに注意してください。 instanceOfの使用を避けるには、このquestionで受け入れられた答えを見てください。

+0

「一般的に悪い習慣」ではないので、あなたの声明は間違っています。それは与えられた文脈でそれを使うのは悪いですが、一般的ではありません。 – Antoniossss

+0

私はあまりにも多くを一般化しました。それが役に立つことができる状況がありますが、実際には特定の状況では避けることができます。 –

0

arrayListを繰り返し、instanceofを使用して型をチェックし、次にキャストしてメソッドと属性を使用します。このようなことを試してみてください。

for (User user : arrayList) { 
    if (user instanceof Manager) { 
     Manager manager = (Manager) user; 
     //manager.method(); 
    } else if(list instanceof SalesMan){ 
     SalesMan salesMan = (SalesMan) user; 
     //salesMan.method(); 
    }  
} 
0

代替がgetClass()を使用してクラスの型を取得するには、次のようになります。

for (Object obj : userArrayList) { 
    if (obj.getClass().equals(Manager.class)) { 
     ... 
    } 
    if (obj.getClass().equals(Salesman.class)) { 
     ... 
    } 
} 

instanceofははサブクラスの場合が、この方法でも動作することもに留意しなければならない、それは勝ちました't。

0

親切にあなたのソリューションのためのリンクの下には、次のとおりです。

https://stackoverflow.com/a/34437757/3095589

は、それはあなたに参考になることができるかもしれない...

0

を他の答えは完全にあなたが尋ねたものを達成する方法を説明しますがあなたがやろうとしていることは、さまざまな理由でオブジェクト指向設計の悪い習慣と一般的にみなされます。

  1. カップリング:コードがオブジェクトの型に基づいて決定を下すときには、さらに型を追加するたびに条件付きチェックを追加する必要があります。つまり、Userの3番目の型です。コードを指数関数的に維持することが難しくなるため、これは悪いことです。追加のサブクラスを追加するときは、特別な動作が必要なコード内のすべての場所を見つける必要があります。言及された場所の1つとコードブレークでもこれを忘れてください。
  2. instanceofを使用すると、スーパークラスのさまざまなサブクラスを異なる方法で扱う必要があることを意味します。スーパークラスはおそらく最初にスーパークラスになるのに十分な共有機能/データを持たなかったでしょうか?なぜそれらがほとんど特性を共有しない場合、それらを一緒に保存するのですか?

コードの再設計を検討してください。それでもマネージャーTicketSalesManユーザーから継承しなければなりませんし、あなたが反復ループ内でそれらにいくつかの操作を実行する必要があると思われる場合は、メソッドをオーバーライド代わりにinstanceofを使用することを検討してください。以下のコードを見てください:

public abstract class User 
{ 
    public abstract void doOperation(); 
} 

public class Manager extends User 
{ 
    public void doOperation() 
    { 
     // do stuff that managers do 
    } 
} 

public class SalesMan extends User 
{ 
    public void doOperation() 
    { 
     // do stuff that salesmen do 
    } 
} 

public class Main 
{ 
    public static final void main(String[] args) 
    { 
     ArrayList<User> users = getUsers(); 
     for(User u: users) 
     { 
      u.doOperation(); 
     } 
    } 
} 
関連する問題