[C# チュートリアル] C# ポリモーフィズム

黄舟
リリース: 2016-12-24 13:49:20
オリジナル
1367 人が閲覧しました

C# ポリモーフィズム

ポリモーフィズムとは、複数の形式を持つことを意味します。オブジェクト指向プログラミング パラダイムでは、ポリモーフィズムは「1 つのインターフェイス、複数の機能」として表現されることがよくあります。

ポリモーフィズムは静的または動的にすることができます。静的ポリモーフィズムでは、関数の応答はコンパイル時に発生します。動的ポリモーフィズムでは、関数の応答は実行時に発生します。

静的ポリモーフィズム

コンパイル時の関数とオブジェクトの接続メカニズムは初期バインディングと呼ばれ、静的バインディングとも呼ばれます。 C# には、静的ポリモーフィズムを実装するための 2 つの手法が用意されています。

関数のオーバーロード

演算子のオーバーロード

演算子のオーバーロードについては次の章で説明し、その後で関数のオーバーロードについて説明します。

関数のオーバーロード

同じスコープ内に同じ関数名の複数の定義を持つことができます。関数定義は、パラメーター リスト内のパラメーターのタイプまたはパラメーターの数によって、互いに異なっている必要があります。戻り値の型のみが異なる関数宣言はオーバーロードできません。

次の例は、異なるデータ型を出力するために使用されるいくつかの同一の関数 print() を示しています:

using System;
namespace PolymorphismApplication
{
   class Printdata
   {
      void print(int i)
      {
         Console.WriteLine("Printing int: {0}", i );
      }

      void print(double f)
      {
         Console.WriteLine("Printing float: {0}" , f);
      }

      void print(string s)
      {
         Console.WriteLine("Printing string: {0}", s);
      }
      static void Main(string[] args)
      {
         Printdata p = new Printdata();
         // 调用 print 来打印整数
         p.print(5);
         // 调用 print 来打印浮点数
         p.print(500.263);
         // 调用 print 来打印字符串
         p.print("Hello C++");
         Console.ReadKey();
      }
   }
}
ログイン後にコピー

上記のコードがコンパイルされて実行されると、次の結果が生成されます:

Printing int: 5
Printing float: 500.263
Printing string: Hello C++
ログイン後にコピー

動的ポリモーフィズム

C# を使用すると、次のことが可能になります。キーワード abstract を使用して、インターフェイスの部分クラスの実装を提供する抽象クラスを作成します。派生クラスがこの抽象クラスを継承すると、実装が完了します。抽象クラスには、派生クラスによって実装できる抽象メソッドが含まれています。派生クラスには、より特殊な機能があります。

抽象クラスに関するいくつかのルールに注意してください:

抽象クラスのインスタンスを作成することはできません。

抽象クラスの外で抽象メソッドを宣言することはできません。

クラス定義の前にキーワード sealed を置くことで、クラスをシールドとして宣言できます。クラスがシールされたと宣言された場合、そのクラスを継承することはできません。抽象クラスはシール済みとして宣言できません。

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

using System;
namespace PolymorphismApplication
{
   abstract class Shape
   {
      public abstract int area();
   }
   class Rectangle:  Shape
   {
      private int length;
      private int width;
      public Rectangle( int a=0, int b=0)
      {
         length = a;
         width = b;
      }
      public override int area ()
      { 
         Console.WriteLine("Rectangle 类的面积:");
         return (width * length); 
      }
   }

   class RectangleTester
   {
      static void Main(string[] args)
      {
         Rectangle r = new Rectangle(10, 7);
         double a = r.area();
         Console.WriteLine("面积: {0}",a);
         Console.ReadKey();
      }
   }
}
ログイン後にコピー

上記のコードがコンパイルされて実行されると、次の結果が生成されます:

Rectangle 类的面积:
面积: 70
ログイン後にコピー

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

動的ポリモーフィズムは、抽象クラスと仮想メソッドを通じて実現されます。

次のプログラムはこれを示しています:

using System;
namespace PolymorphismApplication
{
   class Shape 
   {
      protected int width, height;
      public Shape( int a=0, int b=0)
      {
         width = a;
         height = b;
      }
      public virtual int area()
      {
         Console.WriteLine("父类的面积:");
         return 0;
      }
   }
   class Rectangle: Shape
   {
      public Rectangle( int a=0, int b=0): base(a, b)
      {

      }
      public override int area ()
      {
         Console.WriteLine("Rectangle 类的面积:");
         return (width * height); 
      }
   }
   class Triangle: Shape
   {
      public Triangle(int a = 0, int b = 0): base(a, b)
      {
      
      }
      public override int area()
      {
         Console.WriteLine("Triangle 类的面积:");
         return (width * height / 2); 
      }
   }
   class Caller
   {
      public void CallArea(Shape sh)
      {
         int a;
         a = sh.area();
         Console.WriteLine("面积: {0}", a);
      }
   }  
   class Tester
   {
      
      static void Main(string[] args)
      {
         Caller c = new Caller();
         Rectangle r = new Rectangle(10, 7);
         Triangle t = new Triangle(10, 5);
         c.CallArea(r);
         c.CallArea(t);
         Console.ReadKey();
      }
   }
}
ログイン後にコピー

上記のコードがコンパイルされて実行されると、次の結果が生成されます:

Rectangle 类的面积:
面积:70
Triangle 类的面积:
面积:25
ログイン後にコピー

上記は [c# チュートリアル] C# ポリモーフィズムの内容です。その他の関連コンテンツについては、フォローしてください。 PHP 中国語 Web サイト (www.php.cn)!


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