2016-09-30 21 views
3

私はRubyでオブジェクトをキャストすることについて多くの検索を行いました。文字列を整数にキャストしたり、その逆の例を見つけることができます。私は、次のような何かを行うことができるように期待する...これらのクラスで例えば...Rubyクラスの継承

class Animal 
    attr_accessor :weight, :name 
end 

class Duck < Animal 
    def speak 
    'Quack' 
    end 
end 

他、より複雑なオブジェクトをキャストする方法を興味があります。

irb> animal = Animal.new 
irb> duck = (Duck)animal 
irb> duck.speak 
=> "Quack" 

しかし、私はJavaやそれに類する言語のように、どのようにキャスティングを行うのか分かりません。

+0

'irb'の最後のコマンドは' duck.speak'ですか? –

+0

'Animal'をモジュールにしたり、' Duck'クラス(またはAnimalのサブクラスではない他のクラス)に含めることができ、クラスを_Animalify_することができます。私はキャストに慣れていないので、これが似ているかどうかは分かりません。 –

+0

これを見てください:http:// stackoverflow。com/questions/3374065/convert-a-class-to-a-subclass-on-instantiation –

答えて

2

Rubyのオブジェクトは特定のクラスで作成され、同じクラスで破棄されます。変更されることはありません。キャストすることはできません。を呼び出す関数は、新しいオブジェクトを作成するか、別のプロキシとして使用するプロセスです。あなたはキャストすることはできませんが、あなたは同じ性質を持つアヒルを作成することができますあなたの場合は

class Animal 
    attr_accessor :weight, :name 

    def initialize(options) 
    # Allow calling new with either an options hash, or another 
    # animal that's intended to be cloned. 
    case (options) 
    when Animal 
     @weight = options.weight 
     @name = options.name 
    when Hash 
     @weight = options[:weight] 
     @name = options[:name] 
    end 
    end 
end 

class Duck < Animal 
    def speak(phrase) 
    '%s says %s' % [ name, phrase.inspect ] 
    end 
end 

animal = Animal.new(weight: 10, name: 'Bill') 

duck = Duck.new(animal) 
puts duck.speak('quack!') 

二番目のオプションを使用すると、ミックスインすることができます別のモジュールにアヒルのような機能を移動することです:

module ActsAsDuck 
    def speak 
    'Quack!' 
    end 
end 

animal.extend(ActsAsDuck) 
puts animal.speak 

これは、そのモジュールのどのメソッドでも、オブジェクトインスタンスに混在します。

1

あなたが知っている限り、javaのサブクラスにオブジェクトをキャストすることはできません。オブジェクトはスーパークラスまたは実装されたインターフェイスにのみキャストできます。ルビーではこのキャスティングは必要ありません。 Duckというインスタンスがある場合は、Animalとして扱うことができます。

2

Rubyについて理解しておくべきことの1つは、タイプの概念がオブジェクトのクラスに関連していないことです。オブジェクトは、元のクラス以外の複数のインタフェースに応答することができます(たとえば、モジュールを含める、またはシングルトンメソッドを定義するなど)。したがって、特定のインタフェースにアクセスするためにオブジェクトを型キャストする必要はありません。これは、オブジェクトであることが重要でないことを意味します。実際に重要なことは、それがです。です。

この概念は文字列と整数にも適用されます。文字列を整数に型キャストしない場合は、文字列オブジェクトに、この形式のそれ自身の考え方である新しい整数を作成するよう依頼します。あなたはこれについてさらに理解をしたい場合は

は、私はあなただけのように直接Duckオブジェクトをインスタンス化することができ、あなたのケースで

を入力ダックとして知られている概念について読むことをお勧め:

irb> duck = Duck.new 
irb> duck.quack 
=> "Quack" 
1

これで十分ですか?

class Animal 
    def subclass klass 
    klass.new 
    end  
end 

class Duck < Animal 
    def speak 
    'Quack' 
    end 
end 

animal = Animal.new 
duck = animal.subclass(Duck) 
duck.speak 
    #=> "Quack"