next up previous contents
Next: 12 クラスにおける変数 Up: algorism_out Previous: 10 配列とハッシュ

Subsections


11 クラスとオブジェクトの概要

クラス定義を利用したプログラミング手法(オブジェクト指向プログラミング)は、 大規模なプログラムを作成するには大変有効な方法である。

11.1 オブジェクトとは

オブジェクトとは、``ある機能を持ったもの''といえる。 例えば、
  print "Hello! My name is Kougei Taro. \n"
と書いた場合、
"Hello! My name is Kougei Taro. \n"
の部分がオブジェクトになり、``print'' は、メ ソッドという。 この例では、、
"Hello! My name is Kougei Taro. \n"
が printと言うメソッドの引数になっている。 オブジェクトは変数として別のオブジェクトに代入できる。
testobj = "Hello! My name is Kougei Taro. \n" 
print testobj
実行結果は同じになる。
print testobj, "\n"

それにたいして、例えばこの文字列の 長さを知りたいときは

print testobj.length
print "文字列の長さは"
print testobj.length, "です。\n"

``オブジェクト.メソッド''
という形式になっている。 これを「オブジェクトにメソッドを作用させた」という。

11.1.0.1 練習

それでは、次のプログラムを打ち込んで、各行の意味を考えよ。 また、実行結果はどのようになったか?
-------------------------------------------------
testobj = "Hello! My favorite food is fruit. \n" 
print testobj
p  testobj
print "文字数は", testobj.length, "です。", "\n"
-------------------------------------------------

11.2 クラスとは その1

クラスとはオブジェクトを生成するための雛型(ひながた)になるプログラムであ る。 設計図とも言える。
\includegraphics[width = 8cm]{/home/nisimiya/Bunsho/Daigaku_and_Jimu/Lesson/Subject/Algorism/Fig/clsa.eps}
``メソッド定義''の部分が具体的な設計図になる。

class Name

  クラス定義

end
上記がクラスの文法形式であるが、``クラス定義''の部分には ``メソッド'' が入る。

class Name

  def method1
    aaaaaaaaa
  end

  def method2
    bbbbbbbbb
  end

  def method3
    ccccc
  end

end
形式的にはこのようになる。


11.3 クラスの -具体例-

例えば、1 から 100までの和を求めるプログラムをクラスを利用して作る。 Rubyでクラスを作るにあたって、いくつかルールがある。 まず、クラス名は 何でもよいが大文字ではじめなければならない。

メソッド名は小文字ではじめる(ここでは wasan)。

class Number      # ==> 必ず大文字ではじめる

  def wasan(a,b)
    sum = 0
    for n in a..b do
      sum = sum + n   
  #   print sum, "\n"                    
    end                                 
    print "合計は ", sum, "です。\n"
  end

end
どのように実行するのか。 クラス定義の終わりは ``end''になるが、その下(外側)に次の2行を加える。
a = Number.new
a.wasan(1,100)

1行目は``Number''のインスタンスを生成して、それを ``a''に代入している。 ``Number オブジェクトの生成''という言い方をしてもよい。 2行目は生成したインスタンス中のメソッド ``wasan''を実行している。

できあがったプログラムをもう一度書くと、

------------------------------------------
class Number

  def wasan(a,b)
    sum = 0
    for n in a..b do
      sum = sum + n   
  #   print sum, "\n"                    
    end                                 
    print "合計は ", sum, "です。\n"
  end

end

a = Number.new  #新しいインスタンスの定義
a.wasan(1,100)  #インスタンスの中の "wasan"の実行
a.wasan(1,10)
------------------------------------------
の様になる。

11.3.0.1 練習

  1. 階乗のプログラムをメソッドとして作成し、上記のクラスに付け加えよ。

    解答

    ------------------------------------------
    class Number
    
      def wasan(a,b)
        sum = 0
        for n in a..b do
          sum = sum + n   
         end                                 
        print "合計は ", sum, "です。\n"
      end
    
      def kaijo(a)
        kai = 1
        for n in 1..a do
          kai = kai * n
        end
        print a,"の階乗は ", kai, "です。\n"
      end
    end
    a = Number.new
    a.wasan(1,100)
    a.wasan(1,10)
    
    a.kaijo(5)
    a.kaijo(10)
    ------------------------------------------
    
  2. さらに $\frac{1}{1}+\frac{1}{2}+\frac{1}{3} \cdots \frac{1}{m}$を計 算するメソッドを付け加えよ。

11.4 クラスとは その2

上記の練習問題を模式的に書くと以下の様になる。
\includegraphics[width = 10cm]{/home/nisimiya/Bunsho/Daigaku_and_Jimu/Lesson/Subject/Algorism/Fig/clsa2.eps}
クラスを呼び出すときは、``ABCD.new''と書くのだが、呼び出したクラスを代入 する変数を用意し、以下のように代入する。
a = ABCD.new
となる。 定義されたクラス変数に ``method1''などを作用させることによって、メソッド の内容が実行される。
a.metho1
これを ``インスタンスの生成''という。インスタンスが生成された時点で、 ``method1''のプログラムは実行される。 また、実行結果は返り値として ``a.metho1''自身に値が代入される。 と言うよりは、値が代入されるようにプログラムを作ることができる。

もう一度以下のプログラムを見てもらいたい。

------------------------------------------
class Number

  def wasan(a,b)
    sum = 0
    for n in a..b do
      sum = sum + n   
     end                                 
 #   print "合計は ", sum, "です。\n"
   return sum
  end

  def kaijo(a)
    kai = 1
    for n in 1..a do
      kai = kai * n
    end
 #   print a,"の階乗は ", kai, "です。\n"
    return kai
  end
end

a = Number.new
print  "合計は ", a.wasan(1,100),"です。\n"
print  "合計は ", a.wasan(1,10),"です。\n"

print  a.wasan(1,100) + a.wasan(1,10), "は、合計の合計です。 \n"

a.kaijo(5)
a.kaijo(10)
------------------------------------------
print文をコメントアウトして、``return''文により返り値を設定している。 これにより、計算結果がクラス定義の外に取り出せるようになった。




平成22年12月28日