ポリモーフィズムは、C# などのオブジェクト指向プログラミング言語で実現される概念であり、演算子または関数メソッドが実行プロセス全体を通じて複数の形式を取ることができます。プログラム内での継承の実装には広く使われており、演算子のオーバーロードと関数のオーバーロードの2つの方法に分類されます。簡単に言うと、ポリモーフィズムは、両方のクラスが異なるプロパティを持つ派生クラスを使用して基本クラスを変更する手法として説明できます。
次の図は、ポリモーフィズムの仕組みを示しています。
この図は、粘土が鍋、ボウル、おもちゃのオブジェクトが作られる親オブジェクトであることを説明しています。これらのオブジェクトはすべて互いに異なりますが、粘土の特性を持っています。この3つは同じ粘土という素材でも形が異なり、使い方も異なります。
以下はポリモーフィズムの 2 つの形式です:
オペレーターは、演算対象のオペランドのタイプに基づいてさまざまな出力を与えることができます。これは演算子のオーバーロードと呼ばれます。たとえば、演算子「+」は 2 つの整数の加算を実行でき、同時に 2 つの文字列を連結できます。したがって、同じ演算子を 2 つの異なる方法で使用できます。加算演算子は通常、2 つの数値を加算します。ただし、複素数の場合、加算は少し異なり、対応する実数部と虚数部が別々に加算されます。以下は、「+」演算子をオーバーロードして複素数を加算する方法を示すコード例です。
コード:
using System; namespace Overload { class Complex { public double x; public double y; // no-argument constructor public Complex() {} // parameterized constructor public Complex(double real, double img) { x = real; y = img; } // Overloading of Binary "+" operator public static Complex operator + (Complex c1, Complex c2) { Complex c3 = new Complex(); c3.x = c1.x + c2.x; c3.y = c1.y + c2.y; return c3; } // function to display result public void display() { Console.WriteLine("{0} + {1}i", x,y); } } class CalNum { // Driver Code static void Main(string[] args) { Complex num1 = new Complex(2.5,3.5); Complex num2 = new Complex(1.2,6.5); Complex num3 = num1 + num2; Console.Write("c1 = "); num1.display(); Console.Write("c2 = "); num2.display(); Console.Write("c3 = "); num3.display(); } } }
出力:
この出力は、2 つの複素数を加算する演算子のオーバーロードを示しています。このコードは、演算子のオーバーロードと関数のオーバーロードを示しています。
関数は、パラメーターの数、戻り値の型、関数の戻り値の型に基づいて、さまざまな出力を与えることができます。上記のコードでは、コンストラクターを使用した関数のオーバーロードもカバーしています。コードには 2 つのコンストラクターがあります。 1 つは空のままのデフォルトのコンストラクターで、もう 1 つはパラメーターとして指定された値で複素数を初期化するために使用されるパラメーター化されたコンストラクターです。
図の例で言えば、機能は粘土の成形であり、ストローク方向は粘土を成形するために設けられた部材である。異なるストロークの方向に基づいて、粘土はそれぞれ鍋、ボウル、おもちゃに変形します。
コード:
using System; using System.Collections.Generic; public class Clay { // A few example members public int Height { get; set; } public int strokeDirection { get; set; } // Virtual method public virtual void Mould() { Console.WriteLine("Beginning to mould the clay"); } } class Pot : Clay { public override void Mould() { // Code to make a pot Console.WriteLine("Making a pot"); base.Mould(); } } class Bowl : Clay { public override void Mould() { // Code to make a bowl Console.WriteLine("Making a bowl"); base.Mould(); } } class Toy : Clay { public override void Mould() { // Code to make a toy Console.WriteLine("Making a toy"); base.Mould(); } } class Program { static void Main(string[] args) { // Illustrating Polymorphism #1: a Pot, Bowl and Toy // can all be used wherever Clay is expected. No cast is // needed because an implicit conversion exists from a derived // class to its base class. var items = new List<Clay> { new Pot(), new Bowl(), new Toy() }; // Polymorphism at work #2: the virtual method Mould is // invoked on each of the derived classes, not the base class. foreach (var item in items) { item.Mould(); } } }
出力:
コードでお気づきかと思いますが、粘土クラスは親クラスであり、その子クラスはポット、おもちゃ、ボウルのクラスです。メソッド「Mould」は、同じ関数シグネチャを持つ親クラスと子クラスで定義されています。したがって、子クラスのオブジェクトが作成され、それがメソッド Mould を呼び出すと、基本クラスのメソッドは子クラスのメソッドによってオーバーライドされます。したがって、子クラス メソッドの出力が表示されます。上記のコードは、ポリモーフィズムを説明するために、オーバーロードではなくメソッドのオーバーライドを示しています。
C# のポリモーフィズムで留意すべき点:
以下にいくつかの重要なポイントを示します:
以上がC# におけるポリモーフィズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。