クラスの設計と使用
オブジェクト指向プログラミング (OOP) では、クラスはアプリケーションの構成要素です。 クラスとオブジェクトの関係を理解することは不可欠です。
- クラスは、開発者がオブジェクトのプロパティ (データ) とメソッド (動作) を定義するために使用するブループリントです。 クラスは、データと動作をカプセル化する方法を提供し、コードの整理と管理を容易にします。
- オブジェクトはクラスのインスタンスです。 クラスがインスタンス化されると、オブジェクトがメモリ内に作成されます。 各オブジェクトには独自のプロパティとメソッドのセットがありますが、クラスによって定義されたのと同じ構造を共有します。
実際のオブジェクトを調べることは、クラスとオブジェクトがプログラミングでどのように機能するかを理解するのに役立ちます。 実際のオブジェクトには、目的と機能を定義する属性 (プロパティ) と動作 (メソッド) があります。 たとえば、自動車は、make、model、color などの属性と、運転や停止などの動作を持つオブジェクトです。
現実世界のオブジェクト
人々は日常生活の中で常にオブジェクトと対話します。 実際、私たちがやり取りするほとんどすべてのものがオブジェクトと考えることができます。
次の条件を使用して、現実世界のオブジェクトを定義できます。
- オブジェクトは、私たちが見て触れることができるものです。
- オブジェクトには目的があります。
- オブジェクトには、その目的をサポートするパーツがあります。
鉛筆は、物理オブジェクトの例です。 鉛筆の目的は、メモまたは図面を作成するためです。 鉛筆の部分には、ボディ、先端、そしておそらく消しゴムが含まれます。 パーツが連携して、鉛筆の目的を達成します。
他のオブジェクトのアセンブリとして存在する物理オブジェクトもあります。 他のオブジェクトで構成されるオブジェクトの例を次に示します。
- 車:車の目的は、個人や家族のための地上輸送を提供することにある。 車の部品には、エンジン、車輪、ステアリングホイールなどが含まれます。 自動車の部品は、地上輸送を可能にするために連携します。
- 家:家の目的は、シェルターを提供するためです。 家の一部には基礎、外壁、屋根、部屋があります。 これらのパーツが連携して、生活空間を作り出します。
- スマートフォン: スマートフォンの目的は、ユーザーが日常的なタスクやアクティビティを支援することです。 スマートフォンの部分には、画面、マイクロプロセッサ、メモリとストレージ、バッテリー、カメラ、ボタンが含まれます。 これらのパーツは連携して、コミュニケーション、エンターテイメント、生産性の機能を実現します。
車、家、スマートフォンの各部分は、独自の目的を持つオブジェクトであり、オブジェクトのアセンブリである場合もあります。
物理オブジェクトの属性と機能
鉛筆の例を少し考えてみましょう。 鉛筆には、パーツ (本文、先端、消しゴム) と目的 (メモまたは描画を作成する) があります。 鉛筆は、これらの基本的な特性を共有します。 ただし、すべての鉛筆が同じであるわけではありません。
鉛筆は短く、長い鉛筆もあります。 鉛筆の中には黄色、黒の鉛筆があります。 一部の鉛筆は鈍い先端を持ち、一部は鋭い先端を持っています。 鉛筆には消しゴムが付いているものもあれば、消しゴムがないものもあります。
オブジェクトの属性は、多くの場合、次の物理カテゴリと動作カテゴリに分類されます。
- 物理: 物理属性は、表示または測定できるオブジェクトの側面です。
- 動作: 動作属性は、その機能や他のオブジェクトとの相互作用を記述するオブジェクトの側面です。
鉛筆の例では、物理的な属性には、本文の長さ、体の色、先端の切れ味、鉛筆に消しゴムがあるかどうかが含まれます。 動作属性には、書き込み機能、消去する機能、シャープ化する機能が含まれます。 鉛筆は、書き込みまたは描画できる紙やその他の固体オブジェクトと相互作用します。
物理属性はプロパティと呼ばれることがよくありますが、動作属性は多くの場合、関数 (C# プログラミングのメソッド) と呼ばれます。
C# プログラミングのコード クラスとオブジェクト
C# プログラミングの世界では、オブジェクトのプロパティとメソッドはクラスによって定義されます。 クラスは、オブジェクト (クラスのインスタンス) が実行できる内容のブループリントを提供します。 クラスのブループリントは、クラス定義と呼ばれます。
アプリが実行されている場合、コンピューターはクラス定義を使用してオブジェクト (クラスのインスタンス) のメモリを割り当てます。 コンピューターはブループリントを使用して、オブジェクトに適したサイズのメモリ ブロックを構成します。 オブジェクトは基本的にメモリのブロックです。
コード オブジェクトは、物理オブジェクトと同様に、プロパティに異なる値を割り当てることができます。
クラスはデータと動作をカプセル化します
クラスは、データと動作をカプセル化する方法を提供します。 カプセル化は、データと動作を 1 つの単位に結合するプロセスです。 クラスでは、プロパティを使用してデータへのアクセスを有効にし、メソッドを使用して動作を有効にします。
クラスのプロパティ
クラス プロパティは、1 つのオブジェクト (クラス インスタンス) と同じ型の別のオブジェクトを区別するデータを管理するために使用されます。
クラス プロパティを使用すると、オブジェクトはクラス内で定義されている変数 (データ フィールド) の値を読み取り、書き込み、または計算できます。 プロパティはパブリック データ メンバーとして表示されますが、 アクセサーと呼ばれる特別なメソッドとして実装されます。 この機能により、呼び出し元はデータに簡単にアクセスでき、データの安全性と柔軟性を高めるのに役立ちます。
プロパティ値は、get アクセサーを使用して読み取り、set アクセサーを使用して割り当てることができます。
クラス メソッド
クラス メソッドは、クラスが実行できるアクション (動作) を定義します。
メソッドは、入力データを提供するパラメーターを受け取ることができ、パラメーターを使用して出力データを返すことができます。 メソッドは、パラメーターを使用せずに値を直接返すこともできます。
たとえば、Console クラスには、WriteLine、ReadLine、および Clear メソッドが含まれます。 これらのメソッドは、Console クラスの意図した動作を有効にするために役立ちます。 メソッドを使用して、計算、データ操作、他のオブジェクトとの対話などのアクションを実行できます。
多くの場合、メソッドは 1 つ以上のメソッド引数を受け入れるように設計されています。 メソッド引数は、メソッドの呼び出しに使用される呼び出し元ステートメントのパラメーターとしてメソッドに渡されます。 たとえば、WriteLine クラスの Console メソッドは、呼び出し元のステートメントによって提供される文字列引数を受け取ることができます。
C# コードでのクラス定義
次の例は、C# の単純なクラスを示しています。
Phone クラスには、Brand、Model、および Yearのプロパティがあります。 このクラスには、Call と Textのメソッドも含まれています。
public class Phone
{
public string? Brand { get; set; }
public string? Model { get; set; }
public int Year { get; set; }
public void Call(string phoneNumber)
{
Console.WriteLine($"Calling {phoneNumber}...");
}
public void Text(string phoneNumber, string message)
{
Console.WriteLine($"Texting {phoneNumber}: {message}");
}
}
名前空間の使用
C# プログラミングでは、名前空間は次の 2 つの方法で使用されます。
- .NET クラス ライブラリでは、名前空間を使用して多くのクラスを整理します。
- 開発者は、大規模なプログラミング プロジェクトでクラス名とメソッド名のスコープを制御するのに役立つ独自の名前空間を宣言します。
.NET クラス ライブラリ内の名前空間
名前空間は、関連する型をグループ化するために .NET クラス ライブラリによって使用されるため、検索と使用が容易になります。
次のコード スニペットを考えてみましょう。
System.Console.WriteLine("Hello World!");
この例では、System は名前空間であり、Console はその名前空間のクラスです。
クラスの完全修飾名 (System.Console) を指定すると、正しいクラスが使用されます。 ただし、同じ名前空間の多くのクラスを操作する場合、完全修飾名を使用するのは面倒な場合があります。 コードの読みやすさを向上させるために、using ディレクティブを使用できます。
using ディレクティブを使用すると、その型の完全修飾名前空間を指定せずに、名前空間で定義された型を使用できます。
次のコード スニペットでは、コードの読みやすさを向上させるために、using ディレクティブを実装しています。
using System;
Console.WriteLine("Hello World!");
注
.NET 6 以降では、 暗黙的なglobal using ディレクティブが新しい C# プロジェクトに追加されます。 つまり、完全修飾名を指定したり、using ディレクティブを手動で追加したりしなくても、これらの名前空間で定義された型を使用できます。
暗黙的な側面は、グローバル using ディレクティブがプロジェクトの obj ディレクトリ内の生成されたファイルに追加されるという事実を指します。 この機能を使用すると、バージョン 6.0 以降の .NET でアプリを開発するときに Console.WriteLine を明示的に宣言することなく、using System を使用できます。
名前空間を使用したクラスの整理
独自の名前空間を宣言すると、大規模なプログラミング プロジェクトでクラス名とメソッド名のスコープを制御するのに役立ちます。
namespace キーワードを使用して名前空間を宣言します。
次のコード スニペットを考えてみましょう。
namespace SampleNamespace
{
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
}
名前空間の名前は、有効な C# 識別子名である必要があります。
次のコード スニペットに示すように、そのファイルで定義されているすべての型の名前空間を宣言できます。
namespace SampleNamespace;
class SampleClass
{
public void SampleMethod()
{
System.Console.WriteLine("SampleMethod inside SampleNamespace");
}
}
class AnotherSampleClass
{
public void AnotherSampleMethod()
{
System.Console.WriteLine("AnotherSampleMethod inside SampleNamespace");
}
}
この新しい構文の利点は、よりシンプルで、水平方向のスペースと中かっこを節約できる点です。 これにより、コードの読みやすさが高くなります。
名前空間の概要
名前空間には、次のプロパティがあります。
- 大規模なコード プロジェクトを整理します。
- これらは、
.演算子を使用して区切られます。 -
usingディレクティブは、すべてのクラスの名前空間の名前を指定する要件を廃止します。 - グローバル名前空間は "ルート" 名前空間です。
global::Systemは常に .NET System 名前空間を参照します。
名前空間を使用して関連する型をグループ化すると、それらを簡単に見つけて使用できます。