Ruby簡潔学習ノート(二):クラス継承、属性、クラス変数
3563 ワード
1.サブクラスの宣言方法
このようにThingクラスの属性name,descriptionはTreasureによって継承される.
2.次の3つの方法で親initializeメソッドに入力されるパラメータはそれぞれ何ですか?
第1のパラメータの中でa,b,cを親類initializeに伝達する方法.第2のパラメータはすべて入力されますが、カッコは付けません.第3の非入力パラメータ
3.属性のsetter/getter
setter/getterと書く人がいます.
これはもっと便利なようです.
2つ目の書き方をしたい場合は、次のように書かなければなりません.
注意:これは正しいです:def name=(aName)
しかし、これは間違っています.def name=(aName)
違いを見ましたか.
前章によれば、ここではdescriptionメソッドとdescription=メソッドの2つのメソッドが定義されていることがわかります.もともとは「=」をメソッド名に入れることで実現されていたが、rubyは不思議で、Javaはそう書くことができなかった.
しかし、実際にはsetter/getterを実現するより簡単な方法があります.
attr_からreader/attr_writerに記号(:description)を付けて構成すると、実際には複数の要素にsetter/getterを一度に設定できます
次のように等価です.
4.super
Javaとは異なり、Rubyのsuperメソッドはinitialize(構築メソッド)だけでなく、任意のメソッドに表示されます.
2つ目のポイントでは、superメソッドの使用について説明します.個別のsuperはすべてのパラメータを親initializeに渡し、パラメータ付きsuperは指定したパラメータを親initializeに渡します.
5.定数とネストクラス(constants&nested class)
定数:大文字で始まる変数.
定数または内部クラスにアクセスするには:
6.部分クラス(Partial Class)
Rubyでは既存のクラスを変更し、生成されたオブジェクトに影響を与えることができます.
変更できないのは、クラスがどのクラスを継承しているかです.たとえば
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