抽象クラス

Scalaにおける抽象クラス(abstract class)は、オブジェクト指向プログラミングにおいて共通の基本構造や動作を定義しつつ、一部の実装をサブクラスに委ねるための仕組みです。Javaの抽象クラスと似ていますが、Scalaにはtraitという別の抽象的な機能もあるため、目的に応じて使い分けることが重要です。


概要

抽象クラスは、abstractキーワードを用いて定義されます。次のような特徴を持ちます。

  • インスタンス化できません

  • 抽象メンバ(未実装のメソッドやプロパティ)を定義できます

  • 具象メンバ(具体的な実装を持つメソッドやフィールド)も定義できます

  • extendsを使って継承され、サブクラスが未実装メンバを実装する必要があります


抽象クラスの定義方法

scala
abstract class Animal { def speak(): String // 抽象メソッド val name: String // 抽象フィールド def info(): String = { // 具象メソッド s"My name is $name" } }

この例では、speakメソッドとnameフィールドは抽象メンバとして定義されており、サブクラスで実装される必要があります。一方でinfoメソッドは具体的な処理を含んでいます。


サブクラスでの実装例

scala
class Dog(val name: String) extends Animal { def speak(): String = "Woof!" }

ここでDogクラスはAnimalを継承し、必要な抽象メンバspeaknameを実装しています。


使用例

scala
val dog: Animal = new Dog("Buddy") println(dog.speak()) // 出力: Woof! println(dog.info()) // 出力: My name is Buddy

trait との違い

特徴 抽象クラス (abstract class) トレイト (trait)
コンストラクタ引数 あり なし(Scala 3では可能)
多重継承 単一継承のみ 複数のトレイトをミックスイン可能
Javaとの互換性 Javaの抽象クラスに近い Javaインターフェースに近い

使い分けの指針

  • 共通のコンストラクタ引数を必要とする場合 → 抽象クラス

  • 複数の機能をミックスインしたい場合 → トレイト

  • Javaと連携する場合(Javaライブラリを継承など) → 抽象クラス


まとめ

Scalaの抽象クラスは、共通の構造や振る舞いを定義しつつ、特定の処理をサブクラスに任せるための基盤として使用されます。インターフェースとしての役割を担うtraitと使い分けることで、柔軟かつ明確な設計が可能となります。

生成日:2025/05/04