Class化
オブジェクト指向へ。キーとなる考え方が
- 隠蔽(capsulation)
- 継承(inheritance)
- 多形(polymorphism)であると。
どういうことですか?
とりあえず、例へ
def puts_hello name
puts "Hello #{name}."
end
def gets_name
name = ARGV[0] || 'world'
return name
end
name = gets_name
puts_hello name
||←これは論理演算子で、nameが ARGV[0]またはworldであるときnameを返すということですね。まだmainでloopがあるのでそこをなくそうという考えらしいです。
定義
以下は結構、ナニソレ美味しいの?が続きます。書式ばっか書いてます。個人的にこっちが好き
クラス化の定義は
class クラス名
end
クラス名の定義の最初の文字は大文字で始める。
そしてここに
class クラス名
def initialize()
...
...
end
end
classとendの間にinitializeメソッドを追記している。
initializeメソッドってなんぞやと
classが"new"されたときに呼び出されるメソッド。であり、classのデータの初期化も行います.
しかし、まだこの状態ではclassを使えない…
ここででてくるのが"new"です。上でもclassが"new"された時と書いてあるけどそれすら意味不明ですよねわかります。書いている当時の私もわかってません
newメソッドを使うことでclassをインスタンス化できる。
インスタンス化とはclassの定義から新たな変数を作ることです。また、インスタンス変数とは以下で登場する@nameのように@から始まる変数のことです。
さて,newメソッドはnewに与えられた引数をそのままinitializeに与えます。
長々と書いてきたけど上のコードを変えて意味を理解していこう。
class Greeter
def initialize
@name = gets_name
puts_hello
end
def puts_hello #salute
puts "Hello #{@name}."
end
def gets_name
name = ARGV[0] || 'world'
return name.capitalize
end
end
Greeter.new
まず,クラス名はGreeterであり、Greeterというクラスのnewメソッドが実行されます。newでの引数がそのままinitializeに与えられます。今回はありませんね。では、@nameというインスタンス変数が現れます。そのインスタンス変数はgets_nameで定義されるようになります.その後puts_helloが実行され、表示に向かいます。(果たして合ってるのでしょうか)
継承とOverride
継承?
継承には<を使用します.
ひとまず、例
class Breeter
def hello
"Hello "
end
end
class Strings < Breeter
def mornig
"morning"
end
end
greeter = Breeter.new
puts greeter.hello
そして
hello
が実行結果です。
一番最後のputs greeter morning にすると実行結果はmorningになります。
このときBreetetクラスはStringsクラスのスーパークラスという。(何故かBreeterをGreeterにするとmismatchが発生し実行できない、間違ったスーパークラスを指定するとでるみたいだけど、定義もしてないのにどこで引っかかってるんだろうか)
Override?
オーバーライドとは、スーパークラスで定義しているメソッドと同じ名前のメソッドを別のクラスで再定義すること。
例へ
require 'colorize'
class Breeter
def hello
"Hello"
end
end
class Strings < Breeter
def moring
"Morning"
end
def hello
"world"
end
end
greeter = Breeter.new
puts greeter.hello.red
string = Strings.new
puts string.hello.green
そして実行結果が
Hello #赤色の文字です
world #緑色の文字です
これでスーパークラスのメソッドをサブクラスで書き換えて使用することができるし、スーパークラスで定義しているものも使うことができる
参考文献
- source ~/my_ruby/grad_members_20f/members/majesty99/for_post/ruby6.org