スポンサーリンク

2015年5月17日

Rubyのクラス定義が分からない!!

タイトル:Rubyのクラス定義が分からない!!

目的:
Rubyにおけるクラス定義の仕方諸々が分からなかったので、
書き方などの基本をまとめテストコードを作成する。

実施環境:
OS:Windows8.1
Ruby:v2.2.2

ディレクトリ構造:
作業ディレクトリ
|-main1.rb
|-main2.rb
|-main3.rb
|-main4.rb

目次:

  1. クラス定義
  2. 継承の仕方
  3. モジュール定義
  4. その他


さて、掲示板を作成する前にふと気づいた。
あれ?...Rubyのクラスやメソッドの記述のどうやるんだ?...っと。
と言うわけなので、ちょっとまとめます。

1.クラス定義

1.1
クラスを定義してメソッドを記述した。
ソースコードは以下の通り作成した。
main1.rb


1.2
クラスの定義
class クラス名
end

メソッドの定義
def メソッド名(引数...)
  return 返り値
end

なお、initializeメソッドはデフォルトのインスタンスメソッドになる。

2.継承の仕方

クラスとは、メソッド群である...

2.1
スーパークラスとサブクラス、メソッドのオーバーライドについて記述した。
ソースコードは以下の通り作成した。
main2.rb


2.2
継承の仕方
class サブクラス名 < スーパークラス名
end

initializeメソッド内の「super」の記述は、
スーパークラスのinitializeを呼び出している。
引数を渡したいときは、「super(引数...)」で記述すればよい。

メソッドのオーバーライドの仕方は、
サブクラスにて、スーパークラスのメソッド(オーバーライド対象)と
同名のメソッドを定義する。

2.3
参考までに継承するものしないものを記述する。
サブクラスに継承するもの

  • インスタンスメソッド
  • クラスメソッド
  • クラス変数
  • 定数

サブクラスに継承されないもの

  • インスタンス変数
  • クラスインスタンス変数


3.モジュール定義

3.1
モジュールを定義し、それをインクルードしたクラスで利用している。
また、モジュールのメソッドをオーバーライドしている。
ソースコードは以下の通り。
main3.rb


3.2
モジュール定義
module モジュール名
end

モジュールのインクルード(mix-in)
class クラス名
  include 利用モジュール名
end

クラス間で「has-a」の関係を行いたいとき使う。

4.その他
2項目詰め込んだせいか...何故か一番ソースが大きい...。

4.1
アクセス制限とアクセッサ(セッター、ゲッター)について記述した。
ソースコードは以下の通り。
main4.rb


4.2
アクセス制限には、3種類ある。

  • private: 定義したクラス内でのみ使用可能
  • protected: 定義したクラスとサブクラス内でのみ使用可能
  • public: 定義したクラス内でも外でも使用可能


アクセッサについて
アクセッサは、インスタンス変数に対してのセッター、ゲッターを提供する。

2.2で継承しないものに「インスタンス変数」が入っている。
なのに何故、サブクラスで親で定義した変数が参照できるのか?
アクセッサを利用しているため。

継承のための詳しい内容はこちらを参考にして頂くと分かり易いと思います。
お気楽 Ruby プログラミング入門 第 11 回 継承

以上!!

参考にさせて頂いたサイト
RubyLife - initializeメソッド
徒然なるままに - Rubyの継承についてのはなし(インスタンス変数,クラス変数,クラスインスタンス変数,インスタンスメソッド,クラスメソッド,定数)
attr_accessor (Module)
Qiita - Ruby | Ruby の private と protected 。歴史と使い分け

管理人の独り言...
本日は、データアクセスメソッド(DAM)パターンをやろうと思いました。
RubyGemsにActiveRecordがあるので必要ないと思い、
急遽方向転換し掲示板作成に取り掛かるが、結局Rubyの記述方法が分からないことに気付く。
仕方がないので、Ruby言語自体の基礎をやることと相成りました。
来週中には、掲示板の記事を上げていけると思います。

備忘メモ:Rubyでは、変数は代入をしないと存在しない。

人気の投稿