3
0

More than 3 years have passed since last update.

part6 Class

Last updated at Posted at 2020-12-17

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 #緑色の文字です

これでスーパークラスのメソッドをサブクラスで書き換えて使用することができるし、スーパークラスで定義しているものも使うことができる

参考文献

チャート式ruby-Ⅵ(hello class)

!ruby-2.5.5p157


  • source ~/my_ruby/grad_members_20f/members/majesty99/for_post/ruby6.org
3
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0