今日のトピックは「単一継承と多重継承」です。継承はオブジェクト指向プログラミングの重要な概念であり、コードの再利用性と拡張性を高めます。単一継承と多重継承の違いを理解することで、設計の選択肢を広げることができます。
目次
基本概念の説明
単一継承
単一継承では、クラスは一つの親クラス(スーパークラス)からのみ継承を受けます。これにより、シンプルで理解しやすい継承構造を保つことができます。
多重継承
多重継承では、クラスは複数の親クラスから継承を受けます。これにより、複数の親クラスの機能を一つのクラスに統合することができますが、設計が複雑になりがちです。
各言語でのサンプルコード
Python
class Parent1:
def greet(self):
return "Hello from Parent1"
class Parent2:
def greet(self):
return "Hello from Parent2"
class Child(Parent1, Parent2):
def greet(self):
return super().greet()
child = Child()
print(child.greet()) # "Hello from Parent1"
C#
class Parent {
public virtual void Greet() {
Console.WriteLine("Hello from Parent");
}
}
class Child : Parent {
public override void Greet() {
Console.WriteLine("Hello from Child");
}
}
C++
class Parent1 {
public:
void Greet() {
std::cout << "Hello from Parent1" << std::endl;
}
};
class Parent2 {
public:
void Greet() {
std::cout << "Hello from Parent2" << std::endl;
}
};
class Child : public Parent1, public Parent2 {
public:
void Greet() {
Parent1::Greet(); // 親クラスを指定してメソッドを呼び出し
}
};
Java
class Parent {
public void greet() {
System.out.println("Hello from Parent");
}
}
class Child extends Parent {
@Override
public void greet() {
System.out.println("Hello from Child");
}
}
JavaScript
class Parent {
greet() {
console.log("Hello from Parent");
}
}
class Child extends Parent {
greet() {
console.log("Hello from Child");
}
}
各言語の解説
言語 | 単一継承 | 多重継承 | 特徴 |
---|---|---|---|
Python | サポート | サポート | 柔軟性が高く、MRO(メソッド解決順序)が重要 |
C# | サポート | 非サポート(インターフェースで対応) | 型安全と明確な設計 |
C++ | サポート | サポート | 高い柔軟性だが、設計が複雑化するリスク |
Java | サポート | 非サポート(インターフェースで対応) | 明確なオブジェクト指向設計 |
JavaScript | サポート(プロトタイプベース) | 非サポート(ミックスインで対応) | 柔軟なオブジェクトモデル |
まとめ
単一継承と多重継承は、それぞれ異なる設計のニーズに応じて使い分けるべきです。単一継承はシンプルで理解しやすく、多重継承は柔軟ですが、複雑さを伴います。次回は「インターフェースと抽象クラス」について学習しましょう。
コメント