C# の継承とポリモーフィズムとプログラム例

⚡ スマートサマリー

C#における継承とポリモーフィズムは、オブジェクト指向の2つの重要な原則です。継承によって子クラスは親クラスのフィールドとメソッドを再利用できますが、ポリモーフィズムによって1つのメソッド名が複数の形式をとることができます。

  • 🧬 継承: 子クラスは親クラスのフィールドとメソッドを継承し、独自のフィールドとメソッドを追加することもできます。
  • 🔒 保護対象メンバー: 親クラスのフィールドを保護対象としてマークすることで、派生した子クラスはそれらを直接再利用できるようになります。
  • 🧩 ポリモーフィズム: 1つのメソッド名が複数の形式をとるため、同じ呼び出しでも状況によって動作が異なります。
  • 🔀 メソッドのオーバーロード: 複数のメソッドが同じ名前を持つが、パラメータが異なり、コンパイル時に解決される。
  • 🧱 Code 再利用: どちらの原則も、重複コードを削減し、関連するクラスの一貫性を保つことを目的としています。
  • 🤖 AI支援: GitHub Copilotは基底クラスと派生クラスをスキャフォールディングし、ML.NETはクラス階層をモデル入力として再利用します。

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

C# における継承とは何ですか?

継承 は C# の重要な概念です。 継承は、親クラスと子クラスを定義する概念です。 子クラスは親クラスのメソッドとプロパティを継承しますが、同時に、必要に応じてメソッドの動作を変更することもできます。 子クラスは、必要に応じて独自のメソッドを定義することもできます。

プログラム例によって C# の継承をより深く理解しましょう。

C# 継承の例

次に、継承の概念をコードに組み込む方法を見てみましょう。

ステップ1) 最初のステップは、Tutorial クラスのコードを変更することです。 このステップでは、以下のコードを Tutorial.cs ファイルに追加します。

C# 継承の例

ここで、「protected」というアクセス修飾子を TutorialID フィールドと TutorialName フィールドの両方に追加する必要があることに注意してください。

このアクセス修飾子については、 アクセス修飾子チュートリアルさて、ここでこの修飾子の目的が分かります。このアクセス修飾子(protected)が付与されている場合にのみ、子クラスは親クラスのフィールドを使用できるようになります。

ステップ2) 2番目のステップは、新しい子クラスを追加することです。このクラスの名前は「Guru「99Tutorial」。この手順では、以下のコードを Tutorial.cs ファイルに追加します。このコードは、Tutorial クラス定義の後に配置する必要があります。

C# 継承の例

Code 説明:-

  1. 最初のステップは、 Guru99Tutorial 子クラス。このクラスは Tutorial クラスの子クラスになることも述べておく必要があります。これは ':' キーワードによって行われます。
  2. 次に、RenameTutorial というメソッドを定義しています。 これは、TutorialName フィールドの名前を変更するために使用されます。 このメソッドは、チュートリアルの新しい名前を含む文字列変数を受け入れます。
  3. 次に、パラメーター pNewName を TutorialName フィールドに割り当てました。 お願い: – 「Guru「99Tutorial」クラスでは、このフィールドにアクセスできます。これは、「Guru「99Tutorial」は、Tutorial クラスの子クラスです。Tutorial クラスのフィールドを protected に設定しているため、このクラスからアクセスできます。

ステップ3) 最後のステップは、メインの Program.cs ファイルを変更することです。コンソール アプリケーションでは、 Guru99Tutorial クラス。このオブジェクトを使用して、RenameTutorial メソッドを呼び出します。次に、GetTutorial メソッドを使用して TutorialName フィールドを表示します。

C# 継承の例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 public class Tutorial
 {
  protected int TutorialID; 
  protected string TutorialName;
  
  public void SetTutorial(int pID,string pName) 
  {
   TutorialID=pID;
   TutorialName=pName;
  }
  
  public String GetTutorial()
  {
   return TutorialName;
  }
 }
  public class Guru99Tutorial:Tutorial
  {
   public void RenameTutorial(String pNewName)
   {
    TutorialName=pNewName;
   }
  
  static void Main(string[] args) 
  {
   Guru99Tutorial pTutor=new Guru99Tutorial();
   
   pTutor.RenameTutorial(".Net by Guru99");
    
   Console.WriteLine(pTutor.GetTutorial());
    
   Console.ReadKey(); 
  }
 }
}

Code 説明:-

  1. 最初のステップは、 Guru99Tutorial クラス。これは「new」キーワードを使用して行います。今回は Tutorial クラスのオブジェクトを作成しないことに注意してください。
  2. RenameTutorial メソッドを使用します Guru99Tutorial クラスを使用して TutorialName フィールドを変更します。文字列「.Net」を渡します。 GuruRenameTutorial メソッドの 99” を参照してください。
  3. 次に、GetTutorial メソッドを呼び出します。このメソッドは定義されていませんが、 Guru99Tutorial クラスでは、このメソッドにアクセスできます。GetTutorial メソッドの出力は、Console.WriteLine メソッドを介してコンソールに表示されます。

上記のコードが正しく入力され、プログラムが正常に実行されると、次の出力が表示されます。

出力:

C# 継承の例

出力から、TutorialName フィールドが「.Net by」に名前変更されたことが明確にわかります。 Guru99」。これは、子クラスから呼び出される RenameTutorial メソッドによって可能になりました。

C# におけるポリモーフィズムとは何ですか?

ポリモーフィズム in C# ポリモーフィズムとは、オブジェクト指向プログラミング(OOP)の概念の一つで、一つの名前が複数の形式を持つことができるというものです。例えば、通信にスマートフォンを使うとします。通信方法は様々で、通話、テキストメッセージ、画像メッセージ、メールなど、何でも構いません。つまり、目的は共通で通信ですが、そのアプローチはそれぞれ異なります。これがポリモーフィズムです。

以下のプログラム例によって、C# ポリモーフィズムをよりよく理解できるようになります。

C# ポリモーフィズムの例

ポリモーフィズムの概念をコードに組み込む方法を見てみましょう。

ステップ1) 最初のステップは、Tutorial クラスのコードを変更することです。 このステップでは、以下のコードを Tutorial.cs ファイルに追加します。

C# ポリモーフィズムの例

Code 説明:-

1 & 2) 最初のステップは、以前の例と同じです。ping SetTutorial メソッドの定義をそのまま示します。

3) このメソッドは、パラメータ pID と pName に基づいて TutorialID と TutorialName を設定します。

4) ここでクラスに変更を加え、SetTutorial という同じ名前の新しいメソッドを追加します。 今回のみ、pName という XNUMX つのパラメーターのみを渡します。 このメソッドでは、TutorialName のフィールドを pName に設定しているだけです。

ステップ2) 最後のステップは、メインの Program.cs ファイルを変更することです。コンソール アプリケーションでは、 Guru99チュートリアルクラス。

C# ポリモーフィズムの例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DemoApplication
{
 class Tutorial
 {
  public int TutorialID; 
  public string TutorialName;
  
  public void SetTutorial(int pID,string pName) 
  {
   TutorialID=pID;
   TutorialName=pName;
  }
  public void SetTutorial(string pName) 
  {
   TutorialName=pName;
  }
  public String GetTutorial()
  {
   return TutorialName;
  }
  
  static void Main(string[] args) 
  {
   Tutorial pTutor=new Tutorial();
   
   pTutor.SetTutorial(1,"First Tutorial");
   Console.WriteLine(pTutor.GetTutorial());
   
   pTutor.SetTutorial("Second Tutorial");
   Console.WriteLine(pTutor.GetTutorial());
    
   Console.ReadKey(); 
  }
 }
}

Code 説明:-

  1. 最初のステップでは、2 つのパラメーターを持つ SetTutorial メソッドを使用します。 ここでは、TutorialID と TutorialName の両方をこのメソッドに渡しています。
  2. XNUMX 番目のステップでは、パラメータを XNUMX つだけ指定して SetTutorial メソッドを呼び出しています。 このメソッドに TutorialName を渡しているだけです。

上記のコードが正しく入力され、プログラムが実行されると、次の出力が表示されます。チュートリアル名とともにチュートリアルIDも取得したい場合は、以下の手順に従ってください。

  1. public int GetTutorialID という別のメソッドを作成します。
  2. そのメソッドに「return TutorialID」というコード行を記述します。 これを使用して、TutorialID を呼び出し側プログラムに返すことができます。

出力:

C# ポリモーフィズムの例

出力から、両方のメソッドが正常に呼び出されたことが明確にわかります。 このため、「First Tutorial」と「Second Tutorial」という文字列がコンソールに送信されました。

よくあるご質問

C# は、クラスを介した単一継承、多段階継承、および階層継承をサポートしています。多重継承はインターフェースを介してのみ実現されます。

いいえ。AC#クラスは1つの基底クラスからのみ継承します。多重継承では、代わりに複数のインターフェースを使用します。

オーバーロードは、コンパイル時に異なるパラメータを持つ単一の名前を使用します。オーバーライドは、実行時に仮想基底メソッドを再定義します。

virtualキーワードは基底クラスのメソッドをオーバーライド可能にし、overrideキーワードは派生クラスでそのメソッドを再定義します。

baseキーワードを使用すると、派生クラスから親クラスのコンストラクタを呼び出したり、隠された、またはオーバーライドされた基本メンバーにアクセスしたりできます。

クラスをシールクラスとしてマークします。シールクラスは基底クラスにはなれないため、それ以上の継承を防ぎ、パフォーマンスが向上します。

はい。GitHub Copilotは、コメントまたはクラス名から基底クラスと子クラスを生成し、仮想メソッドとオーバーライドメソッドを追加します。

ML.NETは、共有メンバーを継承するデータクラスと予測クラスを定義しており、そのパイプラインは共通のトランスフォーマー基本型を再利用します。