2016-05-10 11 views
1

タイトルはすべてです。多型は唯一の解決策です。

多形性が唯一の解決策であるシナリオが必要です。私は多形性の利点を持つ多くのスレッドを見てきましたが、多形性だけの解決策がないシナリオがあります。

同じ質問をする別の方法です:「多型の起源は何ですか?」

+0

「私はシナリオが必要です」 - 私は、この演習の目的は*あなたが考えるものではないと思っています - まず、多形性の選択肢を見つけることができますか?第二に、ポリモーフィズムのシナリオを思い付くことができますか?これらの質問に答えることから始め、次に良いユースケースを探し始める。がんばろう! – alfasin

+0

_最初に多型の代替案を見つけることができますか?_ 代替コードとして冗長コードが使用されます。 秒、多形性のシナリオを思い付くことができますか?_ あなたは私にこれに答えるか、私にだけ思考してもらいたいですか? :) 複数のシナリオ。 –

+0

冗長コードだけではありません。 * composition *も使用できます。複数のシナリオを考え出すことができれば、多態性の使用を正当化するものはありませんか? – alfasin

答えて

0

あなたの質問は何らかの形で解釈されます。

私は最初の間に線を描くことにより、あなたの質問に答えるようにしてみましょう:直接C++やJava、C#のようなプログラミング言語およびコンパイラーでサポートされている

  • 抽象的な概念として

    1. 多型を多型など

    多態性の既定の例は、ベクターグラフィックスツール、たとえばCorel Draw、Inkscape。 キャンバス上に複数の異なる地形(正方形、三角形、円)を描画できるようにしたいとします。

    ここでは、多形性のCONCEPTがその問題の唯一の解決策であることを示唆しましたが、同時に、完全な多態性メカニズムを提供していないものを含め、任意のプログラミング言語でソリューションを書くことができます例えばCのように)。

    明確な多型は、いくつかの「if」条件の形で明らかになる。だから、

    : 場合ポリモーフィズムの概念は、常に唯一のソリューションです:あなたは、いくつかの一般的な動作のサブセットを共有するエンティティのクラスが、また、そのための特別ないくつかの特別な挙動を有する各クラスを持っている

    1. クラスのみ
    2. コンパイル時あなたはあなたのポリモーフィズムの「起源」についての質問に追加のみランタイム

    で、必要とされる具体的なものをクラス分かりません。 多形性の概念は、Primesのように著名なものですが、少なくとも私はこのように感じています。 プログラミング言語における多型の暗黙のサポートは90年代初頭には、C++で開始された、コーレルドローとWordや THE book などの早期WYSWGプログラム(それはもちろん、個人的な観察である)の例以下は

    // example WITH implicit polymorphism 
    abstract class PolyGeometricEntity 
    { 
        public int center_x__mm;     // commen superset 
        public int center_y__mm;     // commen superset 
        public void move(int d_x__mm, int d_y_mm) // commen superset 
        { 
         center_x__mm += d_x__mm; 
         center_y__mm += d_y_mm: 
        } 
    
        public abstract int area();     // commen superset on abstract level, but specialized at implementation level 
        public abstract void draw();    // commen superset on abstract level, but specialized at implementation level 
    } 
    
    class CircleEntity : PolyGeometricEntity 
    { 
        public override int area() 
        { 
         // circle specific 
         return 1; 
        } 
        public override void draw() 
        { 
         // draw a circle 
        } 
    } 
    
    class TriangleEntity : PolyGeometricEntity 
    { 
        public override int area() 
        { 
         // triangle specific 
         return 1; 
        } 
        public override void draw() 
        { 
         // draw a triangle 
        } 
    } 
    
    
    class PolyCanvas 
    { 
        List<PolyGeometricEntity> entities = new List<PolyGeometricEntity>(); 
    
        void CreateEntity(string toCreateClass) 
        { 
         // assume that code is called by the ui 
         // you do not know what the user decides at runtime 
         // Polymorphism 'starting' now: 
         PolyGeometricEntity toCreate = null; 
         if (toCreateClass == "c") { toCreate = new CircleEntity(); } 
         else if (toCreateClass == "t") { toCreate = new TriangleEntity(); } 
         entities.Add(toCreate); 
        } 
    
        void ReDraw() 
        { 
         foreach (PolyGeometricEntity toDraw in entities) 
         { 
          toDraw.draw(); // polymorphism in action! 
         } 
        } 
    } 
    
    
    // example WITHOUT implicit polymorphism 
    abstract class NonPolyGeometricEntity 
    { 
        public int center_x__mm;     // commen superset 
        public int center_y__mm;     // commen superset 
    
        public string entityClass;     
    
        public void move(int d_x__mm, int d_y_mm) // commen superset 
        { 
    
        } 
    
        // explicid Polymorphism, but concept of Polymorphism still present 
        public int area() 
        { 
         if (entityClass == "c") 
         { 
          // return area of cirlce 
         } 
         else if (entityClass == "t") 
         { 
          // return area of triangle 
         } 
         return 0; 
        } 
        public void draw() 
        { 
         if (entityClass == "c") 
         { 
          // draw area of cirlce 
         } 
         else if (entityClass == "t") 
         { 
          // draw area of triangle 
         } 
        } 
    } 
    
    
    
    
    
    class NonPolyCanvas 
    { 
        List<NonPolyGeometricEntity> entities = new List<NonPolyGeometricEntity>(); 
    
        void CreateEntity(string toCreateClass) 
        { 
         // assume that code is called by the ui 
         // you do not know what the user decides at runtime 
         NonPolyGeometricEntity toCreate = null; 
         toCreate.entityClass = toCreateClass; //explit polymorphism 
         entities.Add(toCreate); 
        } 
    
        void ReDraw() 
        { 
         foreach (NonPolyGeometricEntity toDraw in entities) 
         { 
          toDraw.draw(); 
         } 
        } 
    } 
    
  • 関連する問題