Rubyで使う継承とオーバーライドの理解を10倍深める8つのステップ

初心者向けRuby継承とオーバーライド解説のサムネイルRuby
この記事は約13分で読めます。

 

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

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

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

基本的な知識があればカスタムコードを使って機能追加、目的を達成できるように作ってあります。

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

サイト内のコードを共有する場合は、参照元として引用して下さいますと幸いです

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

はじめに

初心者の方でもRubyの継承とオーバーライドを理解し、使用できるようになるための詳細なガイドです。

継承とオーバーライドは、オブジェクト指向プログラミングの中でも特に重要な概念で、その理解はプログラミングスキルを大幅に向上させることが可能です。

具体的なサンプルコードを通じて理解を深め、継承とオーバーライドの使い方、応用例、注意点と対処法、カスタマイズ方法を解説していきます。

●Rubyの継承とは

Rubyの継承とは、あるクラスの属性やメソッドを別のクラスが引き継ぐことを指します。

この際、元のクラスをスーパークラス(または親クラス)、新たに作られたクラスをサブクラス(または子クラス)と呼びます。

継承を行うことで、スーパークラスの機能をそのまま受け継ぐだけでなく、追加や変更も可能となります。

○基本的な継承のサンプルコード

このサンプルコードでは、Animalクラス(スーパークラス)からDogクラス(サブクラス)を作成し、AnimalクラスのメソッドをDogクラスで継承しています。

DogクラスはAnimalクラスの’walk’メソッドを継承し、そのまま使用することができます。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
end

dog = Dog.new
dog.walk  # => "歩く"

このコードを実行すると、「歩く」と表示されます。

DogクラスはAnimalクラスから’walk’メソッドを継承しているため、Dogのインスタンスでも’walk’メソッドを呼び出すことができます。

●Rubyのオーバーライドとは

Rubyのオーバーライドとは、継承したメソッドをサブクラスで再定義し、振る舞いを変更することを指します。

これにより、スーパークラスのメソッドをサブクラスの目的に合わせてカスタマイズすることが可能になります。

○基本的なオーバーライドのサンプルコード

次のサンプルコードでは、Animalクラスから継承したDogクラスで’walk’メソッドをオーバーライドしています。

この例では、Dogクラスでは’walk’メソッドの振る舞いが「歩く」から「走る」に変更されています。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
  def walk
    puts "走る"
  end
end

dog = Dog.new
dog.walk  # => "走る"

このコードを実行すると、「走る」と表示されます。

DogクラスはAnimalクラスから’walk’メソッドを継承した上で、同名のメソッドを定義することでオーバーライドしています。

その結果、Dogのインスタンスで’walk’メソッドを呼び出すと、「走る」と表示されます。

このように、継承とオーバーライドを活用することで、コードの再利用性を高めつつも、クラスごとに振る舞いをカスタマイズすることが可能になります。

次に、これらの概念をさらに深掘りして、具体的な使い方や応用例を見ていきましょう。

●継承とオーバーライドの使い方

Rubyのクラス継承とメソッドのオーバーライドを使うと、コードの再利用性が高まり、機能追加や振る舞いのカスタマイズが容易になります。

それでは、具体的なコードを見ていきましょう。

○サンプルコード1:スーパークラスを作成し継承する

このコードでは、Animalクラスを作成し、そのメソッドをDogクラスで継承しています。

具体的には、Animalクラスに定義された’walk’メソッドがDogクラスにも引き継がれています。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
end

dog = Dog.new
dog.walk  # => "歩く"

このコードを実行すると、「歩く」と表示されます。

Dogクラスは、Animalクラスから’walk’メソッドを継承しているため、Dogのインスタンスから’walk’メソッドを呼び出すことができます。

○サンプルコード2:サブクラスでメソッドをオーバーライドする

次のコードでは、DogクラスがAnimalクラスから’walk’メソッドを継承した上で、そのメソッドをオーバーライドしています。

具体的には、Dogクラスでは’walk’メソッドの振る舞いが「歩く」から「走る」に変更されています。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
  def walk
    puts "走る"
  end
end

dog = Dog.new
dog.walk  # => "走る"

このコードを実行すると、「走る」と表示されます。

Dogクラスは、同名のメソッドを定義することで、Animalクラスから継承した’walk’メソッドをオーバーライドしています。

その結果、Dogのインスタンスで’walk’メソッドを呼び出すと、「走る」と表示されます。

○サンプルコード3:スーパークラスのメソッドをオーバーライドした後に再度オーバーライドする

次に、一度オーバーライドしたメソッドを再度オーバーライドする例を見てみましょう。

このコードでは、Dogクラスが’walk’メソッドをオーバーライドした後、さらにRaceDogクラスで’walk’メソッドを再度オーバーライドしています。

具体的には、RaceDogクラスでは’walk’メソッドの振る舞いが「走る」から「疾走する」に変更されています。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
  def walk
    puts "走る"
  end
end

class RaceDog < Dog
  def walk
    puts "疾走する"
  end
end

racedog = RaceDog.new
racedog.walk  # => "疾走する"

このコードを実行すると、「疾走する」と表示されます。

RaceDogクラスは、Dogクラスから’walk’メソッドを継承した上で、さらにオーバーライドしています。

その結果、RaceDogのインスタンスで’walk’メソッドを呼び出すと、「疾走する」と表示されます。

これにより、同じメソッド名でも、クラスによって異なる振る舞いをさせることができます。

●継承とオーバーライドの応用例

Rubyで継承とオーバーライドを用いた応用例をいくつか見てみましょう。

これらの応用例は、継承とオーバーライドの理解を深めるだけでなく、プログラムを効率的に構成するための参考になることでしょう。

○サンプルコード4:複数のサブクラスから同じスーパークラスを継承する

このコードでは、DogクラスとCatクラスの2つのサブクラスが、共通のスーパークラスであるAnimalクラスからメソッドを継承しています。

具体的には、Animalクラスに定義された’walk’メソッドが、DogクラスとCatクラスにも引き継がれています。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
end

class Cat < Animal
end

dog = Dog.new
dog.walk  # => "歩く"

cat = Cat.new
cat.walk  # => "歩く"

このコードを実行すると、DogのインスタンスとCatのインスタンスの両方が「歩く」と表示します。

これは、DogクラスとCatクラスがAnimalクラスから’walk’メソッドを継承しているためです。

これにより、異なるクラスが同じスーパークラスのメソッドを利用することが可能となり、コードの重複を避けることができます。

○サンプルコード5:オーバーライドを活用した柔軟なコードの作成

次に、オーバーライドを活用した例を見てみましょう。

このコードでは、DogクラスとCatクラスがそれぞれAnimalクラスから継承した’walk’メソッドを、自身の振る舞いに合わせてオーバーライドしています。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
  def walk
    puts "走る"
  end
end

class Cat < Animal
  def walk
    puts "そっと歩く"
  end
end

dog = Dog.new
dog.walk  # => "走る"

cat = Cat.new
cat.walk  # => "そっと歩く"

このコードを実行すると、Dogのインスタンスは「走る」、Catのインスタンスは「そっと歩く」とそれぞれ表示します。

DogクラスとCatクラスは、それぞれの特性に合わせて’walk’メソッドをオーバーライドしています。

これにより、同じメソッドでも、インスタンスによって異なる振る舞いをさせることができます。

オーバーライドをうまく活用することで、より柔軟で読みやすいコードを書くことが可能となります。

次に、継承とオーバーライドを使用する際の注意点と、それに対する対処法を見てみましょう。

●注意点と対処法

Rubyで継承とオーバーライドを利用する際には、いくつかの注意点が存在します。

これらを理解し、適切に対処することで、より良いプログラムを作成することが可能となります。

まず一つ目の注意点は、スーパークラスで定義されているメソッドが、サブクラスで無意識にオーバーライドされてしまう可能性があるということです。

サブクラスで新たにメソッドを定義する際には、同名のメソッドがスーパークラスに存在しないかを確認することが重要です。

もし同名のメソッドがスーパークラスに存在していた場合、それが無意識にオーバーライドされてしまうと、予期せぬ挙動を引き起こす可能性があります。

この問題を解決するためには、スーパークラスとサブクラスでメソッド名を明確に区別することが有効です。

具体的には、各クラスが担当する機能や役割に応じて、メソッド名を適切に選定すると良いでしょう。

次に、オーバーライドしたメソッド内でスーパークラスのメソッドを呼び出す方法について説明します。

これはオーバーライドを行う際の一般的な手法で、スーパークラスのメソッドを一部利用しつつ、追加の機能を実装したい場合に役立ちます。

class Animal
  def walk
    puts "歩く"
  end
end

class Dog < Animal
  def walk
    super
    puts "そして走る"
  end
end

dog = Dog.new
dog.walk  # => "歩く", "そして走る"

このコードでは、Dogクラスの’walk’メソッド内で、superキーワードを使ってスーパークラスの’walk’メソッドを呼び出しています。

そしてその後に、「そして走る」という独自の挙動を追加しています。

このコードを実行すると、「歩く」と「そして走る」とが順に表示されます。

このように、superキーワードを使うことで、スーパークラスのメソッドを一部利用しつつ、その挙動をサブクラスに合わせてカスタマイズすることが可能です。

以上が、Rubyの継承とオーバーライドを使用する際の基本的な注意点と対処法です。

次に、独自の挙動を実装したい場合のカスタマイズの方法について見てみましょう。

●カスタマイズの方法

Rubyの継承とオーバーライドを活用すると、独自の挙動を持つクラスを効率よく実装することができます。

具体的には、すでに存在するクラスの挙動を部分的に変更したり、新たな機能を追加したりすることが可能です。

そのため、既存のコードの再利用性を高めることができ、プログラミング作業の効率化に寄与します。

独自の挙動を持つクラスを作成するためには、まずスーパークラスから継承を行います。

そして、継承したクラスで新たなメソッドを定義したり、既存のメソッドをオーバーライドしたりします。

こうすることで、スーパークラスにない新たな機能を実装することができます。

しかし、スーパークラスのメソッドをオーバーライドする際には注意が必要です。

スーパークラスのメソッドをオーバーライドすると、そのメソッドの挙動が完全に上書きされるため、スーパークラスの挙動を一部維持しつつ新たな挙動を追加したい場合には、適切な手段を選択する必要があります。

具体的には、superキーワードを使用してスーパークラスのメソッドを呼び出し、その後で新たな挙動を追加するという方法があります。

また、Rubyの継承とオーバーライドを活用することで、プログラム全体の設計をより洗練されたものにすることが可能です。

すなわち、一つのクラスが一つの具体的な役割や責任を持つように設計することで、クラスの再利用性を高めるとともに、プログラムの可読性や保守性を向上させることができます。

○サンプルコード6:オーバーライドを活用したカスタムクラスの作成

次に、オーバーライドを活用して独自の挙動を持つカスタムクラスを作成する方法を、具体的なサンプルコードを用いて説明します。

class Product
  def description
    "これは一般的な商品です。"
  end
end

class SpecialProduct < Product
  def description
    super + " しかし、これは特別な商品です。"
  end
end

product = Special

Product.new
puts product.description

このコードでは、まずProductというスーパークラスを定義しています。

このクラスはdescriptionというメソッドを持っており、”これは一般的な商品です。”という文字列を返す挙動を定義しています。

次に、Productクラスを継承したSpecialProductというサブクラスを定義しています。

このサブクラスでは、スーパークラスのdescriptionメソッドをオーバーライドしており、オーバーライドしたメソッド内でsuperキーワードを使用することでスーパークラスのメソッドを呼び出し、その後で新たな挙動を追加しています。

具体的には、スーパークラスのメソッドの返り値に” しかし、これは特別な商品です。”という文字列を追加しています。

このコードを実行すると、次のような結果が得られます。

"これは一般的な商品です。 しかし、これは特別な商品です。"

これは、SpecialProductのインスタンスがdescriptionメソッドを呼び出した際、スーパークラスのメソッドが先に呼び出され、その後でサブクラスで追加した挙動が実行されるためです。

このように、Rubyの継承とオーバーライドを活用すれば、既存のクラスの挙動を部分的にカスタマイズし、新たな挙動を追加することが可能です。

また、スーパークラスの挙動を維持しつつ新たな挙動を追加するためのsuperキーワードの使用方法も理解することができます。

以上が、Rubyの継承とオーバーライドを使ったクラスのカスタマイズの基本的な方法です。

これらの概念とテクニックを理解し、適切に活用することで、効率的かつ柔軟なプログラミングが可能になります。

まとめ

この記事では、初心者でも理解できるように、Rubyでの継承とオーバーライドの基本的な使い方と、それらを活用したクラスのカスタマイズ方法について詳しく説明しました。

また、具体的なサンプルコードを用いて、これらの概念とテクニックを具体的に表しました。

継承とオーバーライドは、オブジェクト指向プログラミングにおける重要な概念であり、それらを理解し活用することで、より効率的かつ柔軟なプログラミングが可能になります。

ぜひこの知識を活かして、プログラミングスキルの向上に努めてください。