ルビーのクラス継承対モジュール


Rubyでは、クラスの継承やモジュールを使用して、プログラム全体で共有機能を提供できます.このポストはクラス継承とモジュールの違いを調査します、そして、それぞれの適切な使用を決定するのを助けるために考慮してください.

クラス継承
Rubyのクラス間の継承は、個別のクラスを維持しながら、共有メソッドへのアクセスを持つクラスの作成を可能にします.子またはサブクラスとして知られている1つのクラスが親またはスーパークラスとして知られているもう一つのクラスから受け継がれるとき、それは親のメソッドのすべてへのアクセスを与えられます.たとえば、私たちは“ダルメシアン”の子クラスを持つ親クラス“dog”を持っているかもしれません.以下のコードでは、継承を使わずにこれらのクラスを定義します.
class Dog

    def bark
        "Woof!"
    end

    def sleep
        "zzzzz"
    end

    def find_that_smell
        "sniff sniff sniff"
    end

end

class Dalmatian

    def bark
        "Woof!"
    end

    def sleep
        "zzzzz"
    end

    def find_that_smell
        "sniff sniff sniff"
    end

end  
頭字語ドライは“自分自身を繰り返さない”のためのスタンド、それはソフトウェア設計の重要な原則です.以下のコードでは、クラス継承を使用して、上記と同じ機能を得ることができますが、私たちはコードを乾燥させておくことの利点があります.私たちのダルメシアンクラスは現在、犬クラスの行動のすべてにアクセスできます.
class Dog

    def bark
        "Woof!"
    end

    def sleep
        "zzzzz"
    end

    def find_that_smell
        "sniff sniff sniff"
    end

end

class Dalmatian < Dog

end  
継承を使用すると、クラス間のメソッドを共有することができます.クラス間の実世界の階層関係を反映したクラス間のメソッドを共有できます.犬が吠えるならば、ダルメシアンは吠えます.
使用を考慮するとき、クラス継承に関する重要な注意は、あなたがもう一つのクラスから継承するもう一つのクラスから継承するクラスから継承することができるが、単一のクラスがそれが定義されている時に1つのクラスから継承できるだけであるということです.

モジュール
動物が壊れている場合にtrueを返すインスタンスメソッドを定義したいと思います.我々は、これを我々の犬クラスの中のインスタンスメソッドと定義することができて、我々の個々の犬種がメソッドを継承させておくことができました.しかし、我々のプログラムが猫とウサギのような他の動物のクラスを持っていたならば、我々は同様にこの方法を提供したかったですか?
class Animal 
end 

class Dog < Animal 
    def can_be_housebroken?
        true
    end 
end 

class Cat < Animal
    def can_be_housebroken?
        true
    end 
end 

class Rabbit < Animal 
    def can_be_housebroken?
        true
    end 
end 
上記のように、これらのメソッドを何度も何度も定義しなければなりません.時々、この場合のように、明確な階層構造を持たないクラス間の機能を共有したい場合があります.既存のクラスの青写真から構築された新しいクラスを作る代わりに、継承するときのように、私たちは単にメソッドをグループ化して、それらのメソッドをいろいろなクラスに利用できるようにすることができます.モジュールは、私たちがちょうどそれをするのを許します.
クラス継承の代わりにモジュールを使いましょう.まず、モジュールを定義します.それから、私たちのクラスの定義の中で、我々はモジュール名と一緒に我々がモジュールで定義された機能へのアクセスを提供したいどんな数のクラスででもキーワードを使うことができます.
module IndoorPet
    def can_be_housebroken?
        true
    end
end  

class Animal 
end 

class Dog < Animal 
    include IndoorPet
end 

class Cat < Animal
    include IndoorPet
end 

class Rabbit < Animal 
    include IndoorPet
end
ご覧のように、モジュールの使用は、明確な親子関係がない状況で機能を拡張し、繰り返しコードを回避するための素晴らしい解決策を提供します.一旦それが定義されるならば、モジュールは多くのクラスに含まれることができます.また、個々のクラスに含めることができますどのように多くのモジュールに制限はありません.使用を考慮するとき、モジュールについて心に留めておく1つのものは、クラスと違って、モジュールのインスタンスを持つことができないということです.

クラス継承対モジュール
クラス継承とモジュールは、両方とも繰り返しコードを減らす間、我々のプログラムを通して機能性を広げるのを許します.モジュール対クラスの継承を使用するときに理解しようとするとき、いくつかの考慮事項には、インスタンス間で階層的な関係があるかどうか、および拡張機能がどのようにグループ間の関係に関連しているのか、インスタンスを作成する必要があるかどうかが含まれます.既に定義済みクラスのフレームワークからクラスを構築しようとしている場合は、クラス継承を使用して親クラスの動作を採用できます.階層的に関連していない多くの異なるクラスでプログラムを繰り返し使用したいメソッド群を作成した場合、モジュールを使用してモジュール内で定義されているメソッドにクラスアクセスを提供できます.
次の投稿では、Rubyのモジュールに深く掘り下げ、includeextendprependのキーワードを探ります.あなたはそのポストを読むことができます.