Ruby簡潔学習ノート(二):クラス継承、属性、クラス変数

3563 ワード

1.サブクラスの宣言方法
 
  
class Treasure < Thing

このようにThingクラスの属性name,descriptionはTreasureによって継承される.
2.次の3つの方法で親initializeメソッドに入力されるパラメータはそれぞれ何ですか?
 
  
# This passes a, b, c to the superclass
def initialize( a, b, c, d, e, f )
  super( a, b, c )
end
# This passes a, b, c to the superclass

def initialize( a, b, c )
  super
end
# This passes no arguments to the superclass
def initialize( a, b, c)
  super()
end


第1のパラメータの中でa,b,cを親類initializeに伝達する方法.第2のパラメータはすべて入力されますが、カッコは付けません.第3の非入力パラメータ
3.属性のsetter/getter
setter/getterと書く人がいます.
 
  
puts( t1.get_description )
t1.set_description( “Some description” )

これはもっと便利なようです.
 
  
puts( t1.description )
t1.description = “Some description”

2つ目の書き方をしたい場合は、次のように書かなければなりません.
注意:これは正しいです:def name=(aName)
しかし、これは間違っています.def name=(aName)
違いを見ましたか.
前章によれば、ここではdescriptionメソッドとdescription=メソッドの2つのメソッドが定義されていることがわかります.もともとは「=」をメソッド名に入れることで実現されていたが、rubyは不思議で、Javaはそう書くことができなかった.
しかし、実際にはsetter/getterを実現するより簡単な方法があります.
 
  
attr_reader :description
attr_writer :description

attr_からreader/attr_writerに記号(:description)を付けて構成すると、実際には複数の要素にsetter/getterを一度に設定できます
 
  
attr_writer(:name, :description)
attr_accessor(:value, :id, :owner)
attr_accessor

次のように等価です.
 
  
attr_reader :value
attr_writer :value

4.super
Javaとは異なり、Rubyのsuperメソッドはinitialize(構築メソッド)だけでなく、任意のメソッドに表示されます.
2つ目のポイントでは、superメソッドの使用について説明します.個別のsuperはすべてのパラメータを親initializeに渡し、パラメータ付きsuperは指定したパラメータを親initializeに渡します.
 
  
# This passes aName, aDescription to the superclass
def initialize( aName,aDescription )
  super( aName, aDescription )
end

# This passes a, b, c to the superclass's aMethod
def aMethod( a, b, c )
  super
end


5.定数とネストクラス(constants&nested class)
 
  
class X
 A = 10
 
 class Y
  def xyz
   puts( "goodbye" )
  end
 end
 
 def self.abc
  puts("hello")
 end
end

定数:大文字で始まる変数.
定数または内部クラスにアクセスするには:
 
  
puts( X::A )
X::abc        # ::
X.abc        #

ob = X::Y.new
ob.xyz


6.部分クラス(Partial Class)
Rubyでは既存のクラスを変更し、生成されたオブジェクトに影響を与えることができます.
 
  
class A
  def a
    puts 'a'
  end
end

a = A.new
a.public_methods(false)// A class public
# => [:a] // a

class A
  def b
    puts 'b'
  end
end

a.public_methods(false)
# => [:a, :b]// a b


変更できないのは、クラスがどのクラスを継承しているかです.たとえば
 
  
class A
  def a
    puts 'a'
  end
end

class A < String
  def c
    puts 'c'
  end
end

# TypeError: superclass mismatch for class A
# Object ,A Object, A String