oops concepts c object oriented programming concept tutorial
このチュートリアルでは、C#でのOOPSの概念について説明します。ポリモーフィズム、カプセル化、継承、抽象化などのオブジェクト指向プログラミングの原則について学ぶことができます。
オブジェクト指向プログラミングは、アクションやロジックではなく、オブジェクトを中心に展開する原則に基づいて機能するプログラミングモデルです。これにより、ユーザーは要件に基づいてオブジェクトを作成し、それらのオブジェクトを操作するメソッドを作成できます。
これらのオブジェクトを操作して目的の結果を得ることが、オブジェクト指向プログラミングの目標です。
=> ここでC#トレーニングチュートリアルのシリーズ全体を探索する
以前のチュートリアルで学んだ概念のいくつかを修正しましょう!
名前空間
C#の名前空間は、クラスのコレクションです。別の名前空間で宣言することにより、あるクラス名を別のクラス名から分離するための構造を提供します。同じ名前のクラスが互いに競合しないようにするためです。
クラス
クラスは、データ型の青写真です。実際にはオブジェクトのコレクションです。これには、オブジェクトと、そのオブジェクトに対して実行する必要のある操作の定義が含まれています。
オブジェクト
オブジェクトはクラスのインスタンスです。
以前のチュートリアルでは、クラスとオブジェクトについてすでに詳細に学習しました。
学習内容:
C#でのオブジェクト指向の概念
オブジェクト指向プログラミングには、次のような他のプログラミングモデルに比べていくつかの利点があります。
- プログラムの正確で明確なモジュラーアプローチにより、理解と保守が容易になります。
- プロジェクトで作成されたクラスとオブジェクトは、プロジェクト全体で使用できます。
- モジュラーアプローチでは、異なるモジュールが独立して存在できるため、複数の異なる開発者が異なるモジュールで一緒に作業できます。
このチュートリアルでは、他の主要なコアOOPSの概念にさらに焦点を当てます。
- カプセル化
- ポリモーフィズム
- 継承
- 抽象化
カプセル化
カプセル化は、プログラマーがデータとコードスニペットをエンクロージャー内にラップできるようにするオブジェクト指向プログラミングの概念です。カプセル化プログラムを使用すると、あるクラスのメンバーを別のクラスから隠すことができます。これは、パッケージ内で論理アイテムを囲むようなものです。それは、利用可能で外部に見える関連情報のみを許可し、それも特定のメンバーにのみ許可します。
カプセル化は、アクセス指定子を使用して実装されます。アクセス指定子は、C#でクラスメンバーの可視性とアクセシビリティを定義するために使用されます。
C#には、次のアクセス指定子が含まれています。
c面接の質問と回答pdf
- 公衆
- 民間
- 保護されています
- 内部
アクセス指定子は、クラスとその値の可視性を定義します。これにより、コードの特定の部分のデータを表示し、別の部分から非表示にすることができます。最も一般的に使用される可視性は、パブリックとプライベートです。
それらを見てみましょう。
公衆: publicキーワードを使用すると、プロジェクト内のどこからでもメンバーを表示できます。このアクセス指定子には、可視性の制限が最も少なくなっています。
民間: プライベートメンバーには、同じクラス内のメンバーのみがアクセスできます。これは、最も制限された可視性の1つです。
保護: 保護されたアクセシビリティにより、クラス内およびこのクラスを継承する別のクラスからメンバーにアクセスできます。
内部: 内部は、プロジェクト内からのアクセシビリティを提供します。別の同様の内部アクセシビリティは、内部で保護されています。これにより、内部と同じことが可能になります。唯一の違いは、子クラスがこのクラスを継承し、別のプロジェクトからでもそのメンバーに到達できることです。
ポリモーフィズム
ポリモーフィズムはギリシャ語の辞書から派生したもので、多くの形式を持つものを意味します。ポリは多くを表し、モーフはフォームを意味します。これにより、C#のクラスに同じ名前の複数の実装を含めることができます。
ポリモーフィズムは基本的に2つの部分に分けられます。
- コンパイル時のポリモーフィズム
- 実行時のポリモーフィズム
#1)静的またはコンパイル時のポリモーフィズム
コンパイル時のポリモーフィズムは、静的ポリモーフィズムとも呼ばれます。メソッドのオーバーロードは、コンパイル時のポリモーフィズムを実現する方法の1つです。コンパイル時にメソッド呼び出しの決定が行われるため、コンパイル時ポリモーフィズムとして知られています。
これは、メソッド名を同じに保ちながら、異なるパラメーターのセットを渡すことによって実現されます。メソッドのオーバーロードでは、システムは最初に使用されたパラメーターをチェックし、パラメーターのセットに基づいて適切なメソッドを呼び出すことを決定します。
例:
class Program { void print(int i, int j) { Console.WriteLine('Printing int: {0}', (i+j) ); } void print(string a, string b) { Console.WriteLine('Printing String: ' , (a+b)); } static void Main(string() args) { Program prog = new Program(); // Call print for sum of integers prog.print(5, 6); // Call to concatenate strings prog.print('Hello','World'); Console.ReadKey(); } }
上記の例では、異なるパラメーターを使用して同じメソッドを2回「print」と呼びました。最初に、2つの整数をパラメーターとして渡し、次に2つの文字列をパラメーターとして渡しました。同じ名前の2つの「印刷」メソッドがあります。
整数システムでパラメーターを渡すと、2つの整数パラメーターを受け入れる「print」という名前のメソッドが検索され、同じ名前の他のメソッドを無視して実行されます。
2番目の部分では、文字列パラメーターを渡しました。この場合も、システムは2つの文字列パラメータを受け入れるメソッドを探します。したがって、渡されたパラメーターに基づいて、最初のメソッドは2つの整数を追加し、次のメソッドは2つの文字列を連結します。
#2)動的ポリモーフィズムまたはランタイムポリモーフィズム
ランタイムポリモーフィズムまたは動的ポリモーフィズムは、メソッド名とメソッドシグネチャの両方が同じ名前とパラメータを持っている場合に発生します。メソッドのオーバーライドは、動的ポリモーフィズムの例です。これにより、ユーザーは部分的なインターフェース実装を備えた抽象クラスを作成できます。
メソッドのオーバーライドは、継承を使用して実現されます。基本クラスと派生クラスの両方をオーバーライドするメソッドを実現するには、同じ名前とパラメーターを使用する必要があります。コンパイル時に、コンパイラはオーバーライドメソッドを認識できないため、エラーはスローされません。メソッドを実行するかどうかの決定は、実行時に行われます。
例:
class Program { public void print() { Console.WriteLine('Printing from class Program'); } } class Execute : Program { public void print() { Console.WriteLine('Printing from class Execute'); } public static void Main(string() args) { Execute exe = new Execute(); exe.print(); Console.ReadLine(); } }
上記のプログラムを実行すると、次の出力が得られます。
Printing from class Execute
クラスExecuteはクラスProgramのすべてのメソッドを継承していますが、両方のクラスに存在するメソッドprintを呼び出すと、子クラスに存在するメソッドが親クラスのメソッドをオーバーライドします。
動的ポリモーフィズムは、抽象化を実装するために使用されます。これにより、ユーザーは、派生クラスに継承されたときにインターフェイスの実装を提供するために使用される抽象クラスを作成できます。抽象クラスにはメソッドの名前/署名を含めることができ、派生クラスにはメソッドのより特殊な定義を含めることができます。
継承
継承はOOPSの概念の重要な部分です。継承では、親クラスと子クラスを定義します。子クラスは、親クラスのすべてのメソッド、オブジェクト、およびプロパティを継承できます。子クラスは、独自のメソッドと特定の実装を持つこともできます。
親クラスは基本クラスとも呼ばれ、基本クラスを継承する子クラスは派生クラスとも呼ばれます。
例:
class Program { public void print() { Console.WriteLine('Printing from class Program'); } } class Execute : Program { public static void Main(string() args) { Execute exe = new Execute(); exe.print(); Console.ReadLine(); } }
ここに、1つのメソッドを持つプログラムという名前のクラスがあります。 Programクラスを継承する別のクラスExecuteがあります。クラスExecuteは派生クラスであり、クラスプログラムは基本クラスと呼ばれます。
これで、クラスプログラムのオブジェクトインスタンスを作成する代わりに、クラスExecuteのオブジェクトインスタンスを作成しました。このインスタンスを使用して、基本クラスからprintメソッドにアクセスできます。
したがって、上記のコードの出力は次のようになります。
Printing from class Program
派生クラスはメソッドを継承するだけでなく、可視性に応じて、フィールドやプロパティなどのほぼすべてのクラスメンバーも継承します。 C#での継承では、多重継承を使用できません。つまり、1つのクラスは複数の異なるクラスから継承できませんが、1つのクラスは別のクラスから継承でき、別のクラスから継承できます。
抽象化
抽象化は、オブジェクト指向プログラミングの主要な原則の1つです。抽象化により、プログラマーは必要な詳細のみを世界に表示し、他の詳細は非表示にすることができます。抽象化は、Abstractクラスとインターフェイスを使用してC#で実現されます。
「Abstract」キーワードを使用すると、クラスを抽象クラスとして宣言できます。 C#のAbstractクラスは、常に階層の基本クラスです。他のクラスとの違いは、インスタンス化できないことです。 C#抽象クラスを継承する必要があります。
例:
class Program { static void Main(string() args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public void Describe() { return 'Description of the car'; } } class Hyundai : Car { }
以下の出力は次のとおりです。
Description of the car
継承または動的ポリモーフィズム中に以前の例と比較すると、類似点が見つかります。最も認識できる違いは、クラスCarの前にabstractキーワードを使用していることです。これをオーバーライドしたい場合、または動的ポリモーフィズムで行ったのと同様の独自の実装を提供したい場合。次に、次の方法でそれを実現できます。
class Program { static void Main(string() args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public virtual string Describe() { return 'Description of the car'; } } class Hyundai : Car { public override string Describe() { return 'Description of the car is now Hyundai'; } }
したがって、このコードを今すぐ実行すると、次の出力が得られます。
Description of the car is now Hyundai
派生クラスメソッドは、基本クラスメソッドをオーバーライドします。このようにして、独自の実装メソッドを使用して、フェラーリ、ポルシェ、BMWなどの異なる派生クラスを作成できます。
よく見ると、抽象クラスのdescriptionメソッドに実装が含まれていないことがわかります。
では、なぜ空のメソッドを定義するのでしょうか。
これは、抽象クラスがメソッドのシグネチャを提供し、サブクラスがこれらすべてのメソッドの実装を作成する義務を負うためです。これにより、基本クラスの共有が可能になりますが、同時に、派生クラスのメソッド実装もチェックされます。
インターフェース
C#では、インターフェイスはクラスの青写真です。インターフェースは抽象クラスに似ており、100パーセントの抽象化を実現するために使用されます。インターフェイス内で説明されているすべてのメソッドは、デフォルトで抽象的です。メソッド本体がなく、インスタンス化できません。
このインターフェースは主に、多重継承と完全な抽象化を実現するために使用されます。インターフェイス内で宣言されたすべてのメソッドシグネチャには、それを実装するクラスまたは構造体からの実装を提供する必要があります。
例:
class Program { static void Main(string() args) { Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } interface Car { string Describe(); } class Hyundai : Car { public string Describe() { return 'Description of the car is now Hyundai'; } }
上記のコードの出力は次のようになります。
Description of the car is now Hyundai
ここでは、インターフェースCarを作成しました。インターフェイスにはメソッド定義を含めることができないため、インターフェイスにメソッド名と戻り値の型を指定しました。次に、インターフェースCarを別のクラスのHyundaiに実装しました。実装されたクラスでは、インターフェース内で定義されたメソッドの定義を提供しました。
結論
オブジェクト指向プログラミングの概念では、プログラムの各部分がオブジェクトとして扱われます。クラスは同様のタイプの要素のコレクションであり、オブジェクトはクラスのインスタンスです。
C#でのカプセル化により、ユーザーはクラスとそのメンバーの可視性を確立できます。ポリモーフィズムを使用すると、メソッドの名前を同じにすることができますが、同じクラス内のパラメーターが異なるか、異なるクラスのパラメーターが異なります。
継承とは、派生クラスとも呼ばれる子クラスが、基本クラスとも呼ばれる親クラスのメソッド、オブジェクト、フィールドなどを含むすべてのプロパティを継承する場合です。抽象化により、プログラムは実装の詳細を非表示にしながら、署名のみを表示できます。
統合プログラム
class Program { void print(int i, int j) { Console.WriteLine('Printing int: {0}', (i + j)); } void print(string a, string b) { Console.WriteLine('Printing String '+ a + b); } static void Main(string() args) { Program prog = new Program(); // Call print for sum of integers prog.print(5, 6); // Call to concatenate strings prog.print('Hello', 'World'); Hyundai hyn = new Hyundai(); String descp = hyn.Describe(); Console.WriteLine(descp); Console.ReadKey(); } } abstract class Car { public virtual string Describe() { return 'Description of the car'; } } class Hyundai : Car { public override string Describe() { return 'Description of the car is now Hyundai'; } }
=> ここでC#トレーニングチュートリアルのシリーズ全体を探索する