C#におけるオブジェクト指向プログラミング(OOP)の実装 – 第3部
オブジェクト指向プログラミング(OOP)は、ソフトウェア開発における非常に重要なパラダイムであり、C#を使用する際に欠かせない概念です。前回までのパートでは、C#での基本的なクラスとオブジェクトの概念を紹介しました。今回のパートでは、OOPの主要な特徴である継承、ポリモーフィズム(多態性)、カプセル化、そして抽象化について詳しく解説します。
1. 継承(Inheritance)
継承は、オブジェクト指向プログラミングの中核的な概念であり、クラスが他のクラスの特性を受け継ぐ仕組みです。これにより、コードの再利用性が高まり、クラスの設計が効率的になります。

C#での継承は、:
(コロン)を使って親クラスを指定することで実現できます。親クラス(基底クラス)からメソッドやプロパティを継承し、子クラス(派生クラス)で新たに機能を追加したり、親クラスのメソッドをオーバーライドしたりすることができます。
例えば、以下のコードを見てみましょう:
csharpusing System;
public class Animal // 親クラス(基底クラス)
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
public class Dog : Animal // 子クラス(派生クラス)
{
public void Bark()
{
Console.WriteLine($"{Name} is barking.");
}
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "Buddy";
dog.Eat(); // 親クラスから継承したメソッド
dog.Bark(); // 子クラス独自のメソッド
}
}
上記のコードでは、Animal
という親クラスがあり、そのクラスをDog
クラスが継承しています。Dog
クラスはAnimal
クラスのEat
メソッドを継承し、さらに独自のBark
メソッドを追加しています。このように、継承を利用することで、コードの再利用が可能になります。
2. ポリモーフィズム(多態性)
ポリモーフィズムとは、同一のメソッド名であっても、異なるクラスで異なる動作をさせることができるというOOPの特性です。C#では、メソッドのオーバーライドを使って、基底クラスで定義されたメソッドを派生クラスで再定義することができます。
ポリモーフィズムの例として、virtual
キーワードとoverride
キーワードを使います。
csharpusing System;
public class Animal
{
public string Name { get; set; }
public virtual void Speak() // virtualを使ってメソッドをオーバーライド可能にする
{
Console.WriteLine("Animal speaks");
}
}
public class Dog : Animal
{
public override void Speak() // 親クラスのメソッドをオーバーライド
{
Console.WriteLine("Woof! Woof!");
}
}
public class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("Meow!");
}
}
class Program
{
static void Main(string[] args)
{
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.Speak(); // "Woof! Woof!" が表示される
myCat.Speak(); // "Meow!" が表示される
}
}
この例では、Animal
クラスにSpeak
というメソッドがあり、Dog
クラスとCat
クラスでそれぞれ異なる動作を定義しています。Animal
クラスのSpeak
メソッドはvirtual
として宣言され、Dog
クラスとCat
クラスでoverride
されています。これにより、同じメソッド名でも異なる動作を実現することができます。
3. カプセル化(Encapsulation)
カプセル化は、データを隠蔽し、外部からのアクセスを制限することによって、クラスの状態を保護する概念です。C#では、アクセス修飾子(public
、private
、protected
など)を使用して、クラスのメンバー(フィールドやメソッド)へのアクセス範囲を制御できます。
例えば、フィールドをprivate
に設定し、public
なプロパティを通じてデータにアクセスすることが一般的です。
csharpusing System;
public class Person
{
private string _name; // privateフィールド
public string Name // publicプロパティ
{
get { return _name; }
set { _name = value; }
}
public void DisplayInfo()
{
Console.WriteLine($"Name: {_name}");
}
}
class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice"; // プロパティを通じてアクセス
person.DisplayInfo(); // メソッドで情報表示
}
}
この例では、Person
クラスの_name
フィールドはprivate
として宣言されており、外部から直接アクセスすることはできません。その代わり、Name
というpublic
プロパティを介してアクセスが可能です。このように、カプセル化によってクラス内部のデータが保護され、外部の変更から守られます。
4. 抽象化(Abstraction)
抽象化は、複雑なシステムを簡素化するために、重要な部分だけを公開し、詳細は隠すというOOPの特徴です。C#では、abstract
キーワードを使って抽象クラスを定義し、そのクラスから継承した子クラスで具体的な実装を行います。
抽象クラスはインスタンス化できませんが、派生クラスによって実装されるべきメソッドを定義することができます。
csharpusing System;
public abstract class Animal
{
public string Name { get; set; }
public abstract void Speak(); // 抽象メソッド
}
public class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Woof! Woof!");
}
}
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "Buddy";
dog.Speak(); // "Woof! Woof!" が表示される
}
}
このコードでは、Animal
クラスが抽象クラスとして定義され、Speak
メソッドは抽象メソッドとして宣言されています。Dog
クラスはAnimal
クラスを継承し、Speak
メソッドを実装しています。抽象クラスは直接インスタンス化できないため、必ず派生クラスで実装を行う必要があります。
結論
C#におけるオブジェクト指向プログラミング(OOP)は、コードの再利用性、保守性、そして効率性を高めるために非常に強力な手法です。継承、ポリモーフィズム、カプセル化、抽象化の各概念を理解し、適切に使用することで、より堅牢で柔軟なソフトウェアの開発が可能になります。
次回は、インターフェースとその使用方法、そしてC#における例外処理について詳しく説明します。それでは、次のパートでお会いしましょう。