RubyのClass

2020-09-25 hit count image

RubyでClassでは何かどう使うか説明します。

概要

このブログではRubyでClassが何か、どう使うか説明します。

Class

Rubyの言語では変数などのデータは全てオブジェクトです。Classはこのオブジェクトの設計図ようなものです。RubyではこのClassをプログラマーが作ることもできるし、必要な時は色んなClassを組み込んで使うこともできます。

Rubyみたいにオブジェクトをベースにする言語をオブジェクト指向言語(Object Oriented Program language)と言います。OOPの一番特徴はClassが継承することができるし、継承を使ってClassが持ってる機能をもらって使うことができます。または、継承でもらったメソッドを継承したClassの方で上書きすることもできます。(Override)

Classの内容を書くことを’Classを定義する’と言います。Classの定義にはClass文を使います。

class Book
...
end

Classからオブジェクトを生成するためにはnewメソッドを使います。

book = Book.new

変数

Classでは色んな変数を使うことができます。Classで使える変数を説明します。

インスタンス変数

インスタンス(Instance)変数はClass中で使えるGlobal変数です。変数名は@から始めます。

class Book
  def printTitle
    puts @title
  end
  ...
end

インスタンス変数はClassから生成したオブジェクトからメソッドを使って参照することができます。オブジェクトの外部から直接参照したり、更新することができません。

class Book
  def initialize
    @title = 'Ruby'
  end

  def printTitle
    puts @title
  end
end

book = Book.new
book.printTitle
# Ruby

Class変数

Class変数はClassで共通で使える変数です。Class変数は同じClassから生成された全てのオブジェクトへ共有される変数で、変数名が@@で始めます。

class Book
  @@publisher = 'dev-yakuza'

  def printPublisher
    puts @@publisher
  end
end

book = Book.new
book.publisher
# dev-yakuza

Class変数はClassを定義する時、初期化することができます。Class変数はClass中のメソッドを使って参照することができますが、Classの外から直接参照することはできません。

定数

Class中で定数を定義することができます。定数はアルパベット大文字で始めます。

class Book
  Language = 'EN'
end

定数は次のようにClassの外部から直接参照することができます。

puts Book::Language

Classの変数と定数は似てますが、Class変数は更新ができます。

class Counter
  @@count = 0

  def plus
    @@count += 1
  end

  def printCount
    puts @@count
  end
end

counter = Counter.new
counter.plus
counter.printCount
# 1

メソッド

ClassのメソッドではインスタンスメソッドとClassメソッドがあります。この二つのメソッドを説明します。

インスタンスメソッド

インスタンスメソッドは一般的なメソッドで、オブジェクトを使ってメソッドを呼びます。

class Greeting
  def initialize
    @name = 'World'
  end

  def hello
    puts 'Hello ' + @name
  end
end

greeting = Greeting.new
greeting.hello
# Hello World

Classメソッド

Classメソッドはオブジェクトへ依存しない処理を定義するとき使えますし、Classを使ってメソッドを呼びます。

class Greeting
  @@name = 'World'

  def Greeting.hello
    puts 'Hello ' + @@name
  end
end

Greeting.hello
# Hello World

ClassメソッドはClassを使って呼ぶことはできますが、インスタンスが生成される時、生成されたインスタンス変数を使うことはできません。。

オブジェクトの初期化

定義したClassのオブジェクトを初期化するためにはinitializeメソッドを使います。

class Book
  def initialize
    @title = 'Ruby'
  end

  def printTitle
    puts @title
  end
end

initializeメソッドはnewメソッドで新しオブジェクトを生成する時自動で呼ばれます。

class Book
  def initialize (author)
    @author = author
  end

  def printAuthor
    puts @author
  end
end

book = Book.new('dev-yakuza')
book.printAuthor
# dev-yakuza

上のようにnewメソッドを使ってinitializeメソッドへパラメーターを渡して初期化することもできます。

アクセサ

オブジェクトの外からインスタンス変数へアクセスする方法はメソッド意外にもアクセサ(Accessor)があります。attr_reader, attr_writer, attr_accessorを使ってアクセサを定義することができます。

class Book
  def initialize
    @title = 'Ruby'
  end

  attr_accessor :title
end

book = Book.new
puts book.title # Ruby
book.title = 'Rails'
puts book.title # Rails

継承

OOPの言語ではすでに存在するオブジェクトの特性を続いて受けることができます。これを継承と言います。

Classの継承

Classの継承はすでに定義されたClassの機能を拡大したり、制限したりして新しClassを作ることを言います。継承の対象になるClassをスーパークラス(Super Class)、継承してもらって新しく作ったClassをサブクラス(Sub Class)と言います。

class [Sub Class] < [Super Class]
  ...
end

次のようにClassの継承を使えます。

class Fruits
  def fruits
    puts "It's a Fruits"
  end
end

class Apple < Fruits
  def apple
    puts "It's an Apple"
  end
end

apple = Apple.new
apple.fruits # It's a Fruits
apple.apple # It's an Apple

上のようにAppleのClassにはfruitsのメソッドが存在してないですが、スーパークラスから継承したので、fruitsメソッドを使うことができます。また、次のようにスーパークラスを継承して生成したサブクラスをまた継承してサブクラスを作ることもできます。

class Fruits
  def fruits
    puts "It's a Fruits"
  end
end

class Apple < Fruits
  def apple
    puts "It's an Apple"
  end
end

class Pie < Apple
  def pie
    puts "It's a Pie"
  end
end

pie = Pie.new
pie.fruits # It's a Fruits
pie.apple # It's an Apple
pie.pie # It's a Pie

サブクラスから継承して新しサブクラスを作る時には、2つ以上のClassから継承することはできません。

オーバーライド

スーパークラスのメソッドをサブクラスで再定義することをメソッドのオーバーライド(Override)と言います。

class Fruits
  def name
    puts "It's a Fruits"
  end
end

class Apple < Fruits
  def name
    puts "It's an Apple"
  end
end

apple = Apple.new
apple.name # It's an Apple

アクセス修飾子

クラスのメソッドへアクセス修飾子(Access Modifier)を使ってメソッドのアクセスを制限することができます。アクセス修飾子にはpublic, private, protectedがあります。アクセス修飾子を指定しない場合は全てpublicになります。

class Book
  def protectedTest
    puts "this is a protected function"
  end

  protected :protectedTest

  def publicTest
    puts "this is a publicTest"
  end
end

book = Book.new
book.publicTest # this is a publicTest
book.protectedTest # protected method `protectedTest' called for #<Book:0x00007f8c6d88ebd0> (NoMethodError)

アクセス修飾子は下記のような特徴があります。 액세스 한정자는 다음과 같은 특징이 있습니다.

アクセス修飾子説明
public制限がなくて呼ぶことができる。
private呼び出すことができない。
protected呼び出すことができない。ただし、メソッドが所属されたオブジェクトでは、呼び出すことができる。
class Book
  def privateTest
    puts "this is a private function"
  end

  private :privateTest

  def protectedTest
    puts "this is a protected function"
  end

  protected :protectedTest

  def publicTest
    puts "this is a publicTest"
    protectedTest
    privateTest
    self.protectedTest
    self.privateTest
  end
end

book = Book.new
book.publicTest
# this is a publicTest
# this is a protected function
# this is a private function
# this is a protected function
# private method `privateTest' called for #<Book:0x00007fa2d9066a98> (NoMethodError)

特異Class定義

特異クラスの定義とは特定オブジェクトでメソッドやインスタンス変数を追加することを意味します。

class Book
  def initialize
    @title = 'Ruby'
    @author = 'dev-yakuza'
  end

  def printTitle
    puts @title
  end
end

book = Book.new

class << book
  def printAll
    puts @title + ' / ' + @author
  end
end

book.printAll
# Ruby / dev-yak

def book.printAuthor
  puts 'Author: ' + @author
end

book.printAuthor
# Author: dev-yakuza

Classの分割定義

Rubyではクラスを分割して定義することができます。

class Book
  def initialize
    @title = 'Ruby'
    @author = 'dev-yakuza'
  end

  def printTitle
    puts @title
  end
end

class Book
  def printAuthor
    puts @author
  end
end

book = Book.new
book.printTitle # Ruby
book.printAuthor # dev-yakuza

あとで追加されたClassのメソッドはそのままClassへ追加されますが、同じメソッドがすでにある場合、既存のメソッドは削除されて新しメソッドが追加あれます。

class Book
  def initialize
    @title = 'Ruby'
    @author = 'dev-yakuza'
  end

  def printTitle
    puts @title
  end
end

class Book
  def printTitle
    puts 'title: ' + @title
  end
end

book = Book.new
book.printTitle # title: Ruby

完了

これでOOPの言語であるRubyでClassと継承について見てみました。RubyはOOP言語なのでClassを良く使います。したがって、今回のブログポストで紹介したClassをよく覚えてください。

私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!

Posts