C Sharp/クラスとメソッド

C#では、クラスはオブジェクト指向プログラミングの基本的な構成要素です。クラスはデータ(フィールドやプロパティ)とそれらのデータを操作するためのメソッド(関数)を含むことができます。以下は、クラスとメソッドの基本的な構造を示すサンプルコードです。
このコードでは、MyClassという名前のクラスが定義されています。このクラスはMyPropertyとMyMethodというメンバー(プロパティやメソッド)を持っています。Programクラス内のMainメソッドでは、MyClassをインスタンス化し、そのプロパティやメソッドを利用しています。
クラスはプログラム内で再利用でき、オブジェクト指向の特性に基づいてデータと振る舞いを組み合わせて記述することができます。これにより、コードの構造化や保守性の向上が図られます。
C#におけるフィールド(field)とプロパティ(property)は、クラス内でデータを保持するための異なる手段です。
フィールドは、クラス内に宣言された変数であり、そのクラスのインスタンスごとに固有のデータを保持します。通常、直接的にアクセスされることがありますが、アクセス修飾子によってアクセス可能な範囲を制限することができます。
プロパティは、フィールドへのアクセスを制御し、フィールドの読み取りや設定に対して特定のロジックを適用するためのメンバーです。プロパティは、外部からフィールドに安全にアクセスするための手段を提供します。通常、プロパティは get と set のアクセサーメソッドを持ちます。
一般的なプラクティスとして、フィールドはクラス内部でのみ使用され、外部からはプロパティを介してアクセスすることが推奨されます。これにより、カプセル化を実現し、クラスの内部実装をより柔軟に管理できます。
C#におけるstaticなプロパティとメソッドは、インスタンス化されたオブジェクトではなく、クラス自体に関連付けられるものです。クラスから直接アクセス可能であり、インスタンスを生成せずに使用できます。
MyStaticPropertyはクラスMyClassに属し、MyClass.MyStaticPropertyとしてアクセスされます。インスタンス化されたオブジェクトからではなく、クラス自体からアクセスできるため、複数のインスタンスで共有される値を表すのに便利です。
MyStaticMethodはインスタンス化されたオブジェクトではなく、クラスMyClass自体に属しています。MyClass.MyStaticMethod()として呼び出されます。staticメソッドはクラスのインスタンスの状態に依存せず、共通の処理を実行するのに適しています。
staticプロパティやメソッドは、インスタンス化されたオブジェクトに固有の値ではなく、クラスレベルの値や振る舞いを表すのに用いられます。
C#における private, protected, public はアクセス修飾子と呼ばれます。これらはメンバー(フィールド、プロパティ、メソッドなど)がどの範囲でアクセス可能かを制御するために使用されます。privateは同じクラス内からのみアクセス可能、protectedはサブクラス内または同じアセンブリ内からアクセス可能、publicはどこからでもアクセス可能を意味します。これらの修飾子はオブジェクト指向プログラミングにおいて、メンバーの可視性とアクセス権を制御するために重要な役割を果たします。
この例では、MyClass に private、protected、public の各フィールドとメソッドを定義し、それぞれのアクセス修飾子がどのように機能するかを示しています。
C#におけるクラスとカプセル化は、オブジェクト指向プログラミングの重要な概念です。カプセル化は、データ(フィールド)とそのデータを操作するメソッド(関数)を1つのユニットにまとめることを指します。これにより、データの隠蔽や制御されたアクセスが可能になります。
クラス内には、データを格納するためのフィールドと、外部からアクセスを制御するためのプロパティがあります。
カプセル化は、クラスのデータを隠蔽し、正しい方法でのみアクセスできるようにすることで、コードの安全性や保守性を向上させます。これにより、コードの予期しない変更や誤った利用を防ぎ、より信頼性の高いプログラムを作成することができます。
C#における継承(Inheritance)は、既存のクラス(親クラスまたは基底クラスと呼ばれる)の特性や機能を新しいクラス(子クラスまたは派生クラスと呼ばれる)に引き継ぐ仕組みです。これにより、コードの再利用性や階層構造の構築が可能になります。
子クラスで親クラスのメソッドを再定義することをオーバーライドと呼びます。これにより、子クラスは親クラスのメソッドをカスタマイズすることができます。
継承は、コードの再利用性や階層構造の明確化に役立ちますが、過度な継承の使用はコードの理解や保守性を複雑にする可能性があります。したがって、適切に設計された継承構造を持つことが重要です。
C#における sealed キーワードは、クラスやメソッドに対して使用され、それらを継承やオーバーライドから封印(sealed)するためのものです。
sealed クラスは、継承を禁止するために使用されます。つまり、sealed キーワードが付いたクラスは継承できません。
上記のように sealed クラスを宣言すると、これを継承することはできません。例えば、この SealedClass を継承しようとする場合、コンパイルエラーが発生します。
sealed メソッドは、基底クラスで宣言されたメソッドを派生クラスでオーバーライドできないようにします。
上記の例では、BaseClass で SealedMethod を sealed 修飾しています。このため、DerivedClass で SealedMethod をオーバーライドすることはできず、コンパイルエラーが発生します。
sealed キーワードは、特定のクラスやメソッドを拡張不可にしたり、オーバーライド不可にするために使われます。これにより、意図せぬ変更や拡張が行われることを防ぐことができます。
sealed キーワードは、クラスやメソッドの意図しない変更や拡張を防ぐために、プログラムの安定性や信頼性を向上させるための手段として使用されます。そのため、安定性やセキュリティを確保するために有用な機能と言えます。
C#では、クラスにおける多重継承(複数のクラスからの継承)はサポートされていません。言い換えると、C#においては1つのクラスは複数の親クラスからの特性や機能を直接的に継承することができません。
この制限は、複数の親クラスからの継承によって生じる潜在的な問題や複雑さを回避するためにあります。多重継承を許可すると、ダイヤモンド継承問題(Diamond Inheritance Problem)などの問題が発生する可能性があります。この問題は、複数の親クラスが同じ祖先クラスを持つ場合、それによって派生クラス内に衝突や競合が生じる可能性があることを指します。
代わりに、C#ではインターフェースを使用して、複数の振る舞いや契約を定義することができます。これにより、1つのクラスが複数のインターフェースを実装することが可能になります。
例えば、次のようにインターフェースを使用できます:
このように、複数のインターフェースを実装することで、1つのクラスが異なる振る舞いを持つことができますが、直接的な複数のクラスからの継承は許可されていません。
C#におけるポリモーフィズムは、同じ名前のメソッドや操作子が異なるクラスで異なる振る舞いを示す機能です。これにより、異なるクラスのオブジェクトが同じメソッド名を使用し、それぞれ独自の実装を持つことができます。
この例では、Animal クラスを継承して Dog クラスと Cat クラスが作成されています。それぞれのサブクラスで MakeSound メソッドをオーバーライドして、犬と猫それぞれの鳴き声を出力しています。
これらのオブジェクトはすべて Animal クラスのインスタンスですが、MakeSound メソッドが各オブジェクトの実際の型に基づいて実行されるため、それぞれ異なる結果が得られます。これがポリモーフィズムの特性です。
ポリモーフィズムにより、同じ名前のメソッドを使用してコードをより柔軟に、拡張可能にすることができます。また、実行時にオブジェクトの実際の型に基づいて適切な実装を選択するため、より効率的なコードを書くことができます。
同じ親クラスから派生したクラスのインスタンスを持つ配列を作成し、その配列をイテレーションする方法はいくつかあります。以下にいくつかの方法を示します。
このコードは、Animal クラスを親クラスとし、それを継承した Dog クラスと Cat クラスを持つ簡単なポリモーフィズムの例です。
Main() メソッドでは、Animal クラスの配列 animals を作成し、それぞれの要素に Animal クラスのインスタンス、Dog クラスのインスタンス、Cat クラスのインスタンスを代入しています。その後、foreach ループを使用して配列内の各要素をイテレーションし、それぞれの MakeSound() メソッドを呼び出しています。
結果として、Dog クラスと Cat クラスはそれぞれの MakeSound() メソッドのオーバーライドによって異なる音声を出力し、ポリモーフィズムが実現されています。これにより、同じインターフェースを持つ異なる種類のオブジェクトを同じ方法で処理することができます。
C#には抽象クラスと純粋仮想関数(抽象メソッド)があります。
抽象クラスは、インスタンス化できないクラスであり、少なくとも1つ以上の抽象メソッドを含むことができます。抽象メソッドは、実装を持たずにメソッドのシグネチャ(戻り値の型とパラメータ)を定義するメソッドです。派生クラスは、抽象クラスから継承し、その抽象メソッドをオーバーライドすることが必要です。

抽象メソッドは、抽象クラスや抽象メソッドが存在する場合に使用されるもので、メソッドの実装がなく、派生クラスで必ずオーバーライドされるべきメソッドです。抽象メソッドは abstract キーワードを使用して定義されます。
派生クラスでは、抽象メソッドをオーバーライドして実装する必要があります。
抽象クラスや抽象メソッドは、ポリモーフィズムや特定のメソッドの実装を強制するために使用され、実際の実装は派生クラスに委ねられます。これにより、クラス階層の設計やメソッドの一貫性を維持するのに役立ちます。

C Sharp|くらすとめそつと