2016-09-05 3 views
0

最近、Javaプログラミング言語の学習を開始しました。スマートデバイスをシミュレートするアプリケーションでポリモーフィズムに関する知識をテストしたかったのです。インターフェイスをスーパークラスとして使用する場合にポリモーフィズムを適用する適切なソリューション

私はOsという名前のインターフェイスを作成しました。このインターフェイスの主な仕事は、継承者が自分で実装すべきものを指示することです。

public interface Os { 
    public ArrayList<App> getApps(); 
    public void installApps(Collection<App> apps); 
} 

私はアンドロイド用に1つとiOS用に2つのクラスを作成しました。 私はまた、Appという名前のインターフェースと、それを継承するAndroidAppとIosAppの2つのクラスを作成しました。

私は可能な限りポリモーフィズムを使用したいが、どこに行くのかはわからない。私はAndroidのosにこのようなタイプのAndroidAppしか受け付けないプライベートコレクションを持ってほしかった ArrayList<AndroidApp> しかし、私はインターフェイスのgetAppsメソッドを実装したいと考えていたので、そのメソッドの戻り値の型をインターフェイスに入れることはできません階層の上に何かが必要なので、代わりにアンドロイドの私的なリストをArrayList<App>に変更しました。

私には、私が持っているオセツにアプリケーションをインストールする方法があります。

public class Android implements Os { 
    private ArrayList<App> androidApps; 
    public void installApps(Collection<App> apps) { 
     //I want to only install Android apps(adding them to my private collection 
     for (App app : apps) { 
      if(app instanceof AndroidApp){ 
       System.out.println("installing android app ... " +app.getAppName()+" installed!"); 
       androidApps.add(app); 
      } 
      else 
       System.out.println(app.getAppName()+" is not an android app!"); 
     } 
    } 
} 

私が前に述べたように、getAppsは私が選択した任意のOSにインストール済みのアプリケーションを返すことを担当しています。

これは概念的な質問です。私は、AndroidとIosのためのより特定のコレクションを使用すべきかどうかを判断するのに問題があります。この

public class AndroidOs{ 
    private Collection<AndroidApp> androidApps; 
} 

代わりの

public class AndroidOs{ 
    private Collection<App> androidApps; 
} 

を使用して同様 が、私はので、私、私のインターフェイスは、両方のオペレーションシステムのための一般的なインタフェースであることの、その目的を失うために起こっている最初のプライベートコレクションを使用していたならば実装しようとするアンドロイド私はArrayList<AndroidApp>ArrayList<App>にキャストできません。

申し訳ありませんが、私の質問が多少曖昧でしたが、私はできるだけ具体的にしようとしました。

+0

ダウン投票あなたがポリモーフィズムを学ぶためにしようとしている示されているが、私の答えの下で、あなたはすでに多型を知っているとコメントしているため。 – webmaster

答えて

2

あなたがgeneric type parameterを探しているように聞こえる:

public interface Os<A extends App> { 
    List<A> getApps(); 
    void installApps(Collection<A> apps); 
} 

public class Android implements Os<AndroidApp> { 
    private ArrayList<AndroidApp> androidApps; 

    @Override 
    public void installApps(Collection<AndroidApp> apps) { 
     for (AndroidApp app : apps) { 
      System.out.println("installing android app ... " +app.getAppName()+" installed!"); 
      androidApps.add(app); 
     } 
    } 
} 
+0

はい!私はこれを完全に忘れてしまった!まあ、リンドンはこれを忘れてしまった。私はこの解決策を私の問題に感謝したい。私が行っているパターンが適していることを願っています。 – MohsenFM

+0

私はそれが "App"または "A extends App"と同じと思う。彼らはここではすべて「アプリ」になるからです。一貫性を高め、AndroidOSにはAndroidAppしかないと確信しています。しかし、AndroidAppをコレクションに追加するのではなく、必要なときにそれらをフィルタリングする必要があります。あなたの状況に適したものを使用してください。 – webmaster

1

まず最初に、あなたはできる限り多態性を使用したいと言っていますが、ソフトウェア開発ではできるだけ多くの方法やデザインパターンを使用していません。 「」が必要なときには「」が使用されます。だから、必要なときにすべてのテクニックやものを使う必要があります。しかし、とにかく私はここで多形性を学びたいと思っています。

定義:

多型は、多くの形態を取るオブジェクトの能力です。親クラス 参照が子クラスオブジェクトを参照するために使用される場合、 OOPで多形性の最も一般的な使用が発生します。 (出典:http://www.tutorialspoint.com/java/java_polymorphism.htm

今すぐ開発の世界から現実のサンプルは:あなたは動物の「リスト」オブジェクトを持っているし、あなたがデータベースからフェッチしているキャッシュリスト内のすべての動物を維持したいといくつかのUIで表現していますが、動物の種類ごとに柔らかく異なるものが表示されます。ここでは、ポリモーフィズムを使用して、すべてのオブジェクトを1か所に保持し、わずかな変更に応じてプロパティを割り当てる必要があります。

Base interface: Animal-->eat();feet(); 
Animal1: Elephant :: Animal-->eat(){print "grass"};feet(){print "four feet"}; 
Animal2: Eagle :: Animal-->eat(){print "meat"};feet(){print "two feet"}; 

List<Animal> animals = new ArrayList<>(); 
animals.add(new Elephant()); 
animals.add(new Eagle()); 

は今、あなたは1つのリストであなたの象と鷲を持っていて、アイテムごとのタイプか、単にフィールドをチェックしてやりたいオブジェクトを作成します。

ご質問の詳細:

Base interface: OS 
public interface Os { 
    public ArrayList<App> getApps(); 
    public void installApps(Collection<App> apps); 
} 

os1: Android :: OS 
os2: IOs :: OS 

Base interface: App 
public interface App { 
    public int getVersion(); 
} 

app1: AndroidApp :: App 
app2: IOsApp:: App 

質問番号1:この構造は、右か?

回答:はい、具体的な理由があります。数人の開発者によって開発された非常に巨大なアプリケーションがあるとしましょう。あなたは開発者です。このプロジェクトの構造と技術を決定し、すべてのOSをあなたのインターフェースのように構成したいとしましょう。次に、ブラックベリーを追加して、OSからBlacberryOSを、AppからBlackberryAppを派生させます。これは、システムに追加されるすべての新しいOSの一貫性を提供します。これは本当です。

質問2:良い方法がありますか?

回答:Therは常に良い方法です。ここでは、Java PL開発の初心者であり、多態性を学びたいと言っています。だから、私が説明したようにアドバイスをしてください:OSのリストを作成し、AndroidOS、OIS、Blackberyyなどを追加してください。リストを繰り返して、その種類に応じて特定のものを印刷してください。それが必要な理由は終わりです。

メソッドオーバーライドを提供することで、サブタイプ固有の印刷プロパティが多相で簡単に構造化されていることがわかります。

+0

ありがとうございます。私はJava Worldを初めて使っていますが、私は構造化されたプログラミングプロジェクトに取り組んでいます。多形性の概念は多少私には新しいものです。 – MohsenFM

+0

ああ、申し訳ありませんが間違って読んでください。今、その部分を修正する。あなたの質問に私の答えは良いですか? – webmaster

+0

問題ありません。はい、努力していただきありがとうございますが、私は既にポリモーフィズムの概念に精通していました。私が知りたいのは、私が正しく使用しているかどうかということでした。 – MohsenFM

関連する問題