目次
概要
このブログでは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をよく覚えてください。
私のブログが役に立ちましたか?下にコメントを残してください。それは私にとって大きな大きな力になります!
アプリ広報
Deku
が開発したアプリを使ってみてください。Deku
が開発したアプリはFlutterで開発されています。興味がある方はアプリをダウンロードしてアプリを使ってくれると本当に助かります。