C#の多型2024 年の最新の入門チュートリアル。このコースでは 静的ポリモーフィズム,関数多重定義,ダイナミックな多型, について学習できます。
多型は、複数の形態が存在することを意味します。オブジェクト指向プログラミングパラダイムにおいて、多型は、多くの場合のように表現される「一のインターフェース、複数の機能」。
多型は、静的または動的にすることができます。 応答関数の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