Latest web development tutorials

C#の多型

多型は、複数形態が存在することを意味します。オブジェクト指向プログラミングパラダイムにおいて、多型は、多くの場合のように表現される「一のインターフェース、複数の機能」。

多型は、静的または動的にすることができます。 応答関数のstatic多型は、コンパイル時に発生します。動的多型において応答関数は、実行時に発生します。

静的ポリモーフィズム

コンパイル時には、接続機構の関数とオブジェクトは、静的バインディングとして知られている、事前バインディングと呼ばれています。 C#の静的ポリモーフィズムを実現するために2つの手法を提供しています。 彼らは以下のとおりです。

  • 関数多重定義
  • 演算子の多重定義

演算子のオーバーロードは、我々は次の関数のオーバーロードを説明します、次のセクションで説明します。

関数多重定義

同じ関数名が複数の定義を有しているために同じ範囲であることができます。 定義された関数は、互いに異なっていなければならないパラメータリストのパラメータの型とすることができ、また、異なるパラメータの数とすることができます。 あなただけの関数宣言の戻り値の型によってオーバーロードすることはできません。

次の例では、異なるタイプのデータを印刷するために、同じ機能プリント()のいくつかを示しています。

システムを用いました。
名前空間のPolymorphismApplication
{
   クラス印刷データ
   {
      無効印刷(int型ⅰ)
      {
         Console.WriteLineを( "印刷INT:{0}"で、i);
      }

      無効印刷(ダブルF)
      {
         Console.WriteLineを( "印刷フロート:{0}"、f)は、
      }

      無効印刷(文字列s)
      {
         Console.WriteLineを( "印刷文字列:{0}"、s)は、
      }
      静的な無効メイン(文字列[] args)
      {
         印刷データのp =新しい印刷データ();
         //整数p.print(5)を印刷するための印刷を起動します。
         //フロートp.printを印刷する(500.263)の印刷を起動します。
         //呼び出しは、印刷文字列p.print(「こんにちはC ++」)に印刷します。
         Console.ReadKey()。
      }
   }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

印刷INT:5
印刷フロート:500.263
印刷文字列:こんにちはC ++

ダイナミックな多型

C#は、あなたが抽象クラスを作成するためにキーワード抽象を使用することでき、インタフェースの実装では、クラスの一部のために用意されています。 派生クラスは抽象クラスから継承する場合、完全な実現しています。抽象クラスは抽象メソッドが含まれ、抽象メソッドは、派生クラスとして実装することができます。派生クラスでは、より特化した機能を持っています。

以下は、抽象クラスのためのいくつかのルールがあることに注意してください:

  • あなたは抽象クラスのインスタンスを作成することはできません。
  • あなたは抽象クラス外の抽象メソッドを宣言することはできません。
  • 密封されたクラス定義のキーワードの前に配置することによりクラスが密封されたクラスとして宣言することができます。クラスが密封された宣言されている場合それは継承できません。 密封されたように抽象クラスが宣言することはできません。

次のプログラムは、抽象クラスを示しています。

システムを用いました。
名前空間のPolymorphismApplication
{
   抽象クラスシェイプ
   {
      パブリック抽象int型の面積();
   }
   クラス長方形:形状
   {
      プライベートint型の長さ;
      プライベートint型の幅;
      (= 0、int型、B = 0のint)公共長方形
      {
         長さ=;
         幅= B;
      }
      公共オーバーライドint型の面積()
      { 
         Console.WriteLineを( "Rectangleクラス面積:");
         リターン(幅*長さ); 
      }
   }

   クラスRectangleTester
   {
      静的な無効メイン(文字列[] args)
      {
         矩形R =新しいRectangle(10、7);
         = r.areaダブルA();
         Console.WriteLineを( "サイズ:{0}"、a)は、
         Console.ReadKey()。
      }
   }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

長方形のクラスのサイズ:
エリア:70

関数は、クラスで定義されている場合に派生クラスで実装する必要がある、あなたは、仮想メソッドを使用することができます。仮想メソッドは、キーワードの仮想を使用して宣言されています 仮想メソッドは異なる継承したクラスに異なる方法で実装することができます。 仮想メソッドの呼び出しは、実行時に発生します。

ダイナミックな多型は、抽象クラスと仮想メソッドを介して達成されます

次のプログラムは、この点を示しています。

システムを用いました。
名前空間のPolymorphismApplication
{
   クラスシェイプ 
   {
      保護されたint型の幅、高さ;
      (= 0、int型、B = 0のint)公共シェイプ
      {
         幅=;
         高さ= B;
      }
      パブリック仮想int型の面積()
      {
         Console.WriteLineを( "親面積:");
         0を返します。
      }
   }
   クラス長方形:形状
   {
      (= 0、INT B = 0の整数)パブリック矩形:塩基(A、B)
      {

      }
      公共オーバーライドint型の面積()
      {
         Console.WriteLineを( "Rectangleクラス面積:");
         リターン(幅*高さ)。 
      }
   }
   クラストライアングル:シェイプ
   {
      (= 0、INT B = 0の整数)のパブリック・トライアングル:塩基(A、B)
      {
      
      }
      公共オーバーライドint型の面積()
      {
         Console.WriteLineを(「トライアングルクラス面積: ");
         リターン(幅*高さ/ 2); 
      }
   }
   クラスの発信者
   {
      公共ボイドCallArea(シェイプSH)
      {
         int型;
         = sh.area()。
         Console.WriteLineを( "サイズ:{0}"、a)は、
      }
   }  
   クラステスター
   {
      
      静的な無効メイン(文字列[] args)
      {
         発信者C =新しい発信者();
         矩形R =新しいRectangle(10、7);
         トライアングルトン=新しいトライアングル(10、5);
         c.CallArea(R)。
         c.CallArea(T)。
         Console.ReadKey()。
      }
   }
}

上記のコードはコンパイルされ、実行されると、次の結果を生成します。

長方形のクラスのサイズ:
エリア:70
クラストライアングルエリア:
エリア:25