読み込み中...

【Ruby】クラスと継承の使い方7選

Rubyでクラスと継承を理解し応用するためのステップバイステップガイドのカバーイメージ Ruby
この記事は約11分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Rubyを学び始めたばかりのあなたに、この記事はRubyのクラスと継承の基礎から応用までを一通り理解できるように作られました。

初心者でもわかりやすい解説と、7つの具体的なサンプルコードを通じて、Rubyのクラスと継承を理解し、自身のコードに活かすことができます。

●Rubyとは

Rubyは、まつもとゆきひろ氏によって開発された高レベルのプログラミング言語であり、オブジェクト指向の特性を持っています。

Rubyは人間の言葉に近いシンタックス(文法)を持つため、読みやすく、書きやすいと評価されています。

○Rubyの特性

Rubyが持つ特性は数多く、その中でも重要なものは「全てがオブジェクトである」という点です。

Rubyでは、文字列や数値、配列、ハッシュなど、全てのデータがオブジェクトであり、それぞれが一意のメソッドを持ちます。

これはRubyの強力な表現力と柔軟性を支えています。

●クラスとは

クラスとは、オブジェクト指向プログラミングにおける基本的な概念の一つで、オブジェクトの設計図のようなものと言えます。

クラスを定義することで、そのクラスに基づくオブジェクト(インスタンス)を作成することができます。

○クラスの定義方法

Rubyでクラスを定義するには、classキーワードを使用します。

次のような形式でクラスを定義します。

class クラス名
  # クラスの内容
end

○クラスの使い方

クラスを使ってオブジェクトを作るには、newメソッドを使います。

オブジェクトを作成したら、そのオブジェクトに対してメソッドを呼び出すことができます。

□サンプルコード1:簡単なクラスの作成と使用

クラスを作成し、それを使用する簡単なコードを紹介します。

この例では、Personというクラスを作成し、nameというインスタンス変数を設定しています。

そして、newメソッドでPersonクラスのインスタンスを作成し、そのインスタンスのnameを出力しています。

class Person
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

person = Person.new("Yamada")
puts person.name  # => "Yamada"

このコードを実行すると、"Yamada"という文字列が出力されます。

Person.new("Yamada")Personクラスのインスタンスを作成し、そのインスタンスのnameを取得しています。

●継承とは

継承は、既存のクラス(親クラス)の属性やメソッドを新たなクラス(子クラス)に引き継ぐことを指します。

これにより、親クラスの機能をそのまま利用したり、必要に応じて変更したりすることが可能となり、コードの再利用性を高めます。

○継承の定義方法

Rubyでクラスの継承を行うには、<記号を使います。

次の形式で子クラスを定義します。

class 子クラス名 < 親クラス名
  # 子クラスの内容
end

○継承の使い方

子クラスは親クラスのメソッドを引き継ぎますが、必要に応じて子クラス内でメソッドを再定義(オーバーライド)することができます。

これにより、似たような性質を持つオブジェクト間でコードを共有しつつ、個々のオブジェクトが必要とする特殊な振る舞いを定義することができます。

□サンプルコード2:クラスの継承と使用

Rubyでクラスの継承を行う方法について解説します。

ここでは、Personクラスを親クラスとして、その属性やメソッドを子クラスStudentに継承します。

この例では、親クラスPersonnameという属性とそのゲッターメソッドを定義し、子クラスStudentでは、親クラスから継承したname属性に加えて、新たにgradeという属性とそのゲッターメソッドを定義しています。

class Person
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

class Student < Person
  def initialize(name, grade)
    super(name)
    @grade = grade
  end

  def grade
    @grade
  end
end

student = Student.new("Suzuki", "2年")
puts student.name  # => "Suzuki"
puts student.grade  # => "2年"

このコードを実行すると、まずStudentクラスのインスタンスが作成され、そのインスタンスのnamegradeがそれぞれ"Suzuki""2年"として出力されます。

super(name)は親クラスのコンストラクタを呼び出しています。

●クラスと継承の組み合わせ

クラスと継承は、Rubyのコードの組織化と再利用性を向上させるための重要な手段です。

クラスはオブジェクトの設計図を提供し、継承は既存のクラスから新しいクラスを作成する際に、既存の属性やメソッドを再利用することを可能にします。

○クラスと継承の組み合わせ方

Rubyでクラスと継承を組み合わせる際の基本的な手順は次の通りです。

1つの親クラスを定義し、その親クラスから一つ以上の子クラスを派生させます。

子クラスは親クラスのすべての属性とメソッドを継承しますが、必要に応じて新たな属性やメソッドを追加したり、親クラスのメソッドをオーバーライド(上書き)したりできます。

□サンプルコード3:クラスと継承の組み合わせ

クラスと継承の組み合わせ方を紹介します。

Personクラスを親クラスとし、それを継承してStudentクラスとTeacherクラスを定義します。

StudentクラスとTeacherクラスはそれぞれPersonクラスのname属性を継承し、加えてそれぞれ独自の属性gradesubjectを持ちます。

class Person
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

class Student < Person
  def initialize(name, grade)
    super(name)
    @grade = grade
  end

  def grade
    @grade
  end
end

class Teacher < Person
  def initialize(name, subject)
    super(name)
    @subject = subject
  end

  def subject
    @subject
  end
end

student = Student.new("Tanaka", "3年")
teacher = Teacher.new("Sato", "数学")

puts student.name  # => "Tanaka"
puts student.grade  # => "3年"
puts teacher.name  # => "Sato"
puts teacher.subject  # => "数学"

このコードを実行すると、まずStudentクラスとTeacherクラスのインスタンスが作成され、その後、各インスタンスのnamegradesubjectが出力されます。

●Rubyでクラスと継承を使う注意点

Rubyでクラスと継承を使う際には、いくつかの注意点があります。

それぞれについて詳しく見ていきましょう。

○クラスの注意点

クラス定義内で定義されるメソッドは、そのクラスのインスタンスで共有されます。

しかし、インスタンス変数(@で始まる変数)はインスタンスごとに独立しています。

そのため、各インスタンスで異なる値を持つことができます。

また、クラス内で定義されるメソッドは基本的にパブリックメソッドとなりますが、外部から直接アクセスできないようにするために、プライベートメソッドを定義することもあります。

この場合、そのメソッドはクラス内部からのみアクセス可能となります。

○継承の注意点

Rubyで継承を使用するとき、子クラスは親クラスのメソッドを自動的に継承しますが、子クラス内で親クラスのメソッドを再定義(オーバーライド)することもできます。

しかし、親クラスのメソッドをオーバーライドする際には、そのメソッドの元々の振る舞いを理解しておくことが重要です。

意図しない結果を避けるためには、親クラスのメソッドを変更する前にその動作を理解しておくことが推奨されます。

●クラスと継承の応用例

それでは、Rubyでのクラスと継承の具体的な応用例について見ていきましょう。

○クラスの応用例

一般的に、Rubyでのクラスの使用は、関連するデータとそのデータに対する操作をまとめるために用います。

たとえば、学生や教師のような異なる種類のデータを管理するためのクラスを作成することで、それぞれの種類のデータに対する特定の操作を定義できます。

□サンプルコード4:クラスの応用例

次のコードは、Rubyでのクラスの応用例を示しています。

この例では、学生と教師のリストを管理するためのSchoolクラスを定義します。

Schoolクラスはstudentsteachersという二つの配列を持ち、それぞれに学生と教師のインスタンスを追加するメソッドを定義しています。

class School
  def initialize
    @students = []
    @teachers = []
  end

  def add_student(student)
    @students << student
  end

  def add_teacher(teacher)
    @teachers << teacher
  end

  def list_students
    @students.each do |student|
      puts student.name + ": " + student.grade
    end
  end

  def list_teachers
    @teachers.each do |teacher|
      puts teacher.name + ": " + teacher.subject
    end
  end
end

school = School.new
school.add_student(Student.new("Yamada", "1年"))
school.add_teacher(Teacher.new("Kobayashi", "英語"))

school.list_students  # => "Yamada: 1年"
school.list_teachers  # => "Kobayashi: 英語"

このコードを実行すると、まずSchoolクラスのインスタンスが作成され、その後、学生と教師のインスタンスが追加されます。

最後に、学生と教師のリストが出力されます。

これにより、学生と教師のデータをまとめて管理し、それぞれのリストを出力することができます。

○継承の応用例

継承は、一般的に既存のクラスの機能を拡張したいときに使用します。

例えば、既存のクラスに新たな属性やメソッドを追加したい場合や、既存のメソッドの動

作を変更したい場合に、そのクラスを継承して新しいクラスを作成します。

□サンプルコード5:継承の応用例

Rubyでの継承の応用例を紹介します。

この例では、既存のPersonクラスを継承して新しいクラスStudentを作成し、そのクラスに新たな属性gradeとそのゲッターメソッドを追加します。

class Person
  def initialize(name)
    @name = name
  end

  def name
    @name
  end
end

class Student < Person
  def initialize(name, grade)
    super(name)
    @grade = grade
  end

  def grade
    @grade
  end
end

student = Student.new("Yamamoto", "2年")
puts student.name  # => "Yamamoto"
puts student.grade  # => "2年"

このコードを実行すると、まずStudentクラスのインスタンスが作成され、そのインスタンスのnamegradeがそれぞれ"Yamamoto""2年"として出力されます。

このように、既存のクラスを継承することで、新たな属性やメソッドを追加することができます。

まとめ

今回は、Rubyにおけるクラスと継承の基本的な使い方から、具体的な応用例までを解説しました。

クラスを使用することで、関連するデータとそのデータに対する操作を一つにまとめることができ、コードをより整理しやすくなります。

また、継承を使用することで、既存のクラスの機能を拡張したり、新たな機能を追加したりすることができます。

しかし、継承を使用する際は注意が必要です。

既存のクラスのメソッドをオーバーライドすると、そのクラスを継承する他のクラスに影響を与える可能性があります。

そのため、親クラスのメソッドを変更する前に、その動作を理解しておくことが大切です。

この記事が、Rubyでのクラスと継承の使い方を理解するための一助になれば幸いです。

コードを書く上での考え方や方法論は、人それぞれ異なりますので、自分自身のスタイルを確立するためにも、さまざまな方法を試してみることをお勧めします。

Rubyの世界にはまだまだ学べることがたくさんありますので、ぜひ挑戦してみてください。