今日のトピックは「抽象クラスと抽象メソッド」です。抽象クラスと抽象メソッドは、オブジェクト指向プログラミングでよく使われる概念であり、共通の機能を持つクラスを設計する際に非常に有効です。これらを理解することで、コードの再利用性や拡張性を高めることができます。
目次
基本概念の説明
抽象クラス (Abstract Class)
抽象クラスは、インスタンスを作成することができないクラスです。クラス設計の基底クラスとして使用され、共通の機能を持つ具体的なサブクラスによって継承されます。
抽象メソッド (Abstract Method)
抽象メソッドは、サブクラスで必ずオーバーライドされるべきメソッドです。抽象メソッド自体は実装を持たず、具体的な処理はサブクラスで定義されます。
各言語でのサンプルコード
Python
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Woof"
class Cat(Animal):
def sound(self):
return "Meow"
# 抽象クラスは直接インスタンス化できない
# animal = Animal() # これはエラーになります
dog = Dog()
print(dog.sound()) # "Woof"
C#
abstract class Animal {
public abstract void Sound();
}
class Dog : Animal {
public override void Sound() {
Console.WriteLine("Woof");
}
}
class Cat : Animal {
public override void Sound() {
Console.WriteLine("Meow");
}
}
// 抽象クラスは直接インスタンス化できない
// Animal animal = new Animal(); // これはエラーになります
Animal dog = new Dog();
dog.Sound(); // "Woof"
C++
class Animal {
public:
virtual void Sound() = 0; // 純粋仮想関数
virtual ~Animal() = default; // 仮想デストラクタ
};
class Dog : public Animal {
public:
void Sound() override {
std::cout << "Woof" << std::endl;
}
};
class Cat : public Animal {
public:
void Sound() override {
std::cout << "Meow" << std::endl;
}
};
// 抽象クラスは直接インスタンス化できない
// Animal animal; // これはエラーになります
Animal* dog = new Dog();
dog->Sound(); // "Woof"
Java
abstract class Animal {
abstract void sound();
}
class Dog extends Animal {
void sound() {
System.out.println("Woof");
}
}
class Cat extends Animal {
void sound() {
System.out.println("Meow");
}
}
// 抽象クラスは直接インスタンス化できない
// Animal animal = new Animal(); // これはエラーになります
Animal dog = new Dog();
dog.sound(); // "Woof"
JavaScript
class Animal {
constructor() {
if (this.constructor === Animal) {
throw new Error("Cannot instantiate abstract class");
}
}
sound() {
throw new Error("Abstract method must be implemented");
}
}
class Dog extends Animal {
sound() {
return "Woof";
}
}
class Cat extends Animal {
sound() {
return "Meow";
}
}
// 抽象クラスは直接インスタンス化できない
// const animal = new Animal(); // これはエラーになります
const dog = new Dog();
console.log(dog.sound()); // "Woof"
各言語の解説
言語 | 抽象クラスの定義 | 抽象メソッドの実装 | 特徴 |
---|---|---|---|
Python | ABC クラスを使用 | @abstractmethod デコレーター | シンプルで柔軟性が高い |
C# | abstract キーワード | abstract メソッドを定義 | 型安全とIDEサポートが充実 |
C++ | 純粋仮想関数を使用 | virtual 関数として定義 | 高速で柔軟だが、明示的な実装が必要 |
Java | abstract キーワード | abstract メソッドを定義 | 強力なオブジェクト指向機能 |
JavaScript | 直接のサポートなし | クラス内でメソッドをオーバーライド | 柔軟でフロントエンドに強い |
まとめ
抽象クラスと抽象メソッドは、クラス設計をシンプルかつ強力にするための重要な概念です。これらを適切に使うことで、コードの再利用性や拡張性を高めることができます。次回は「インターフェースとその応用」について学習しましょう。
コメント
コメント一覧 (1件)
[…] 1-3-2. 抽象クラスと抽象メソッド […]