C# におけるポリモーフィズム

WBOY
リリース: 2024-09-03 15:26:15
オリジナル
1116 人が閲覧しました

ポリモーフィズムは、C# などのオブジェクト指向プログラミング言語で実現される概念であり、演算子または関数メソッドが実行プロセス全体を通じて複数の形式を取ることができます。プログラム内での継承の実装には広く使われており、演算子のオーバーロードと関数のオーバーロードの2つの方法に分類されます。簡単に言うと、ポリモーフィズムは、両方のクラスが異なるプロパティを持つ派生クラスを使用して基本クラスを変更する手法として説明できます。

次の図は、ポリモーフィズムの仕組みを示しています。

C# におけるポリモーフィズム

この図は、粘土が鍋、ボウル、おもちゃのオブジェクトが作られる親オブジェクトであることを説明しています。これらのオブジェクトはすべて互いに異なりますが、粘土の特性を持っています。この3つは同じ粘土という素材でも形が異なり、使い方も異なります。

ポリモーフィズムの形式

以下はポリモーフィズムの 2 つの形式です:

1.演算子のオーバーロード

オペレーターは、演算対象のオペランドのタイプに基づいてさまざまな出力を与えることができます。これは演算子のオーバーロードと呼ばれます。たとえば、演算子「+」は 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();
}
}
}
ログイン後にコピー

出力:

C# におけるポリモーフィズム

この出力は、2 つの複素数を加算する演算子のオーバーロードを示しています。このコードは、演算子のオーバーロードと関数のオーバーロードを示しています。

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();
}
}
}
ログイン後にコピー

出力:

C# におけるポリモーフィズム

コードでお気づきかと思いますが、粘土クラスは親クラスであり、その子クラスはポット、おもちゃ、ボウルのクラスです。メソッド「Mould」は、同じ関数シグネチャを持つ親クラスと子クラスで定義されています。したがって、子クラスのオブジェクトが作成され、それがメソッド Mould を呼び出すと、基本クラスのメソッドは子クラスのメソッドによってオーバーライドされます。したがって、子クラス メソッドの出力が表示されます。上記のコードは、ポリモーフィズムを説明するために、オーバーロードではなくメソッドのオーバーライドを示しています。

C# におけるポリモーフィズムの注意点

C# のポリモーフィズムで留意すべき点:

  • オーバーロードはオーバーライドとは異なります。オーバーロードには異なる関数シグネチャが含まれますが、オーバーライドには同じ関数シグネチャが含まれます。
  • ポリモーフィズムとは、サブクラス内のスーパークラスの動作を変更することを指します。
  • 継承とは、スーパークラスの構造と動作をサブクラスで使用することを指します。

以下にいくつかの重要なポイントを示します:

  • ポリモーフィズムは、オブジェクト指向プログラミングの主要なパラダイムの 1 つです。
  • 関数のオーバーロードは、継承されたクラスの関数の戻り値の型とパラメーターに従って関数を変更します。
  • 演算子のオーバーロードは、指定されたパラメーターに従って演算子の定義を変更します。
  • 継承の実装にはポリモーフィズムが使用されます。実行時に、メソッドのオーバーライドを使用して子クラスのメソッドを呼び出すかどうかを決定します。

以上がC# におけるポリモーフィズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート