C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
C# 抽象クラスと抽象メソッドをマスターする
明確な例、継承パターン、コンストラクター、実用的なユースケースを通じて C# の抽象クラスと抽象メソッドを探求します。
抽象クラス
C# において抽象クラスは直接インスタンス化できないテンプレートとして機能します。abstract キーワードはクラスがサブクラス化されることを意図していることを示します。例:
// 抽象クラスを定義
abstract class Language {
// フィールドとメソッド
}
// インスタンス化を試みるとエラー
// Language obj = new Language();
抽象クラスには抽象メソッド(本体なしの宣言)と具象メソッド(完全に実装されたメソッド)の両方を含められます。例:
abstract class Language {
// 抽象メソッド - 本体なし
public abstract void Display();
// 具象メソッド - 実装あり
public void DisplayInfo() {
Console.WriteLine("Concrete method in abstract class");
}
}
先に進む前に、C# 継承の概念に慣れておいてください。
抽象クラスの継承
抽象クラスは直接インスタンス化できないため、そこから派生した具象サブクラスを作成する必要があります。サブクラスは抽象クラスのメンバーを継承し、派生オブジェクトを通じてそれらを使用できます。例:
using System;
namespace AbstractClassDemo {
abstract class Language {
public void Display() {
Console.WriteLine("Concrete method in abstract class");
}
}
// 具象サブクラス
class Program : Language {
static void Main(string[] args) {
Program prog = new Program();
prog.Display();
Console.ReadLine();
}
}
}
出力
Concrete method in abstract class
この例では Language が抽象クラスで、Program がそれを継承し Display() を呼び出せます。抽象クラスは sealed にできず、常に基底型として機能します。
注意: 複数の派生型が実装する共通の契約が必要な場合にこのパターンを使用します。
C# の抽象メソッド
抽象メソッドは本体なしでシグネチャのみを宣言します。派生した非抽象クラスに実装を義務付けます。例:
public abstract void Display();
抽象クラスのみが抽象メソッドを含められます。具象サブクラスがそのようなクラスを継承する場合、自身も抽象クラスと宣言しない限り、すべての抽象メンバーをオーバーライドしなければなりません。
例:抽象メソッドの実装
using System;
namespace AbstractClassDemo {
abstract class Animal {
public abstract void MakeSound();
}
class Dog : Animal {
public override void MakeSound() {
Console.WriteLine("Bark Bark");
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
dog.MakeSound();
Console.ReadLine();
}
}
}
出力
Bark Bark
ここでは Animal が抽象メソッド MakeSound() を宣言し、具象サブクラス Dog がオーバーライドで契約を果たしています。
注意: 抽象メソッドは暗黙的に virtual なので、virtual キーワードは不要かつ使用不可です。
ゲッター/セッターを持つ抽象プロパティ
抽象アクセサーにより、派生クラスがプロパティの get/set 操作にカスタムロジックを提供できます。例:
using System;
namespace AbstractClassDemo {
abstract class Animal {
protected string name;
public abstract string Name { get; set; }
}
class Dog : Animal {
public override string Name {
get { return name; }
set { name = value; }
}
}
class Program {
static void Main(string[] args) {
Dog dog = new Dog();
dog.Name = "Tom";
Console.WriteLine("Name: " + dog.Name);
Console.ReadLine();
}
}
}
出力
Name: Tom
派生クラスが抽象プロパティを実装し、カプセル化された状態管理を可能にします。
抽象クラスのコンストラクター
抽象クラスはコンストラクターを定義して、すべてのサブクラスで共有される状態を初期化できます。サブクラスインスタンスが作成されると、抽象クラスのコンストラクターが最初に実行されます。例:
using System;
namespace AbstractClassDemo {
abstract class Animal {
public Animal() {
Console.WriteLine("Animal Constructor");
}
}
class Dog : Animal {
public Dog() {
Console.WriteLine("Dog Constructor");
}
}
class Program {
static void Main(string[] args) {
Dog d1 = new Dog();
Console.ReadLine();
}
}
}
出力
Animal Constructor Dog Constructor
必要に応じてサブクラスでデストラクターも定義できます。
注意: コンストラクターはすべての派生型で必要な共通リソースのセットアップに有用です。
抽象クラスによる C# の抽象化
抽象クラスは実装詳細を隠蔽しながらクリーンなインターフェースを公開する抽象化の仕組みを提供します。これにより「どう」ではなく「何」に焦点を当て、複雑なシステムを簡素化します。
現実世界の例:バイクのブレーキシステム。ブレーキの外部振る舞い(バイクを減速・停止させる)は一貫していますが、内部機構はモデルごとに異なります。抽象クラスを使えば各モデルが独自のブレーキロジックを実装しつつ、外部契約を変更しません。
例:バイクのブレーキ
using System;
namespace AbstractClassDemo {
abstract class MotorBike {
public abstract void Brake();
}
class SportsBike : MotorBike {
public override void Brake() {
Console.WriteLine("Sports Bike Brake");
}
}
class MountainBike : MotorBike {
public override void Brake() {
Console.WriteLine("Mountain Bike Brake");
}
}
class Program {
static void Main(string[] args) {
SportsBike s1 = new SportsBike();
s1.Brake();
MountainBike m1 = new MountainBike();
m1.Brake();
Console.ReadLine();
}
}
}
出力
Sports Bike Brake Mountain Bike Brake
ここでは MotorBike が抽象メソッド Brake() を宣言し、各具象バイククラスが固有の実装を提供することでポリモーフィズムを実現しています。
注意: 基底実装を一切持たない完全な抽象化には、インターフェースの使用を検討してください。
C言語
- C# クラスとオブジェクト:堅牢な OOP の基礎
- C# 部分クラスと部分メソッドを理解する
- C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
- C++クラスとオブジェクト完全ガイド:オブジェクト指向プログラミングの実践
- C++フレンド関数とフレンドクラス:アクセス制御のマスター
- C#抽象クラス実践チュートリアル:コード例で理解する設計パターン
- Javaクラスとオブジェクト:実践ガイド
- Java抽象クラスとメソッド:包括的ガイド
- Javaネストクラスとインナークラス完全ガイド:種類、例、ベストプラクティス
- Javaオブジェクトとクラス:コアOOP概念を完全理解
- Java抽象化完全ガイド: 抽象クラス・抽象メソッドで実装を隠蔽し設計を簡潔に