2016-08-06 5 views
7

Может кто-нибудь, пожалуйста, дать некоторое представление о том, когда использовать делегирование через DelegateClass (например, Seller < DelegateClass(Person)) и когда использовать наследование класса (например, Seller < Person) в рубине?DelegateClass vs Class Inheritance in Ruby

class Seller < DelegateClass(Person) 
    def sales 
    ... 
    end 
end 

class Seller < Person 
    def sales 
    ... 
    end 
end 

Когда я просматривал в Ruby On Rails источника на Github я нашел довольно много uses of DelegateClass.

ответ

5

Есть несколько отличий, которые могут помочь обеспечить понимание того, какой подход использовать.

1) Вы можете безопасно делегировать примитивов (например, строка), но не всегда безопасно наследовать от них

Если вы строите на вершине Hash или String или Fixnum, вы безопаснее с помощью DelegateClass (или другим делегатом). Для получения дополнительной информации о том, почему, Steve Klabnik's cautioning - это хорошее место для начала).

2) DelegateClass позволяет легко «конвертировать» более общий объект в более конкретный один

Это делает его легче принять экземпляр общего объекта и заставить его вести себя таким образом, что это конкретные для своей реализации:

class Message < DelegateClass(String) 
    def print 
    upcase 
    end 
end 

# […] 

def log(message) 
    message = Message.new(message) unless message.is_a?(Message) 
end 

3) А Гоча: DelegateClass подклассов ожидать экземпляр делегированного класса в качестве аргумента в new

Это может сделать его сложным для классов «подкласса», которые вы передаете библиотечному коду. Например, это довольно распространенная практика, которая не будет работать из коробки с DelegateClass:

class MyLogger < DelegateClass(ActiveSupport::Logger); end 

Foo::ThirdParty::Library.configure do |c| 
    c.logger = MyLogger # no good 
end 

Это не работает, потому что наша библиотека планирует вести себя, как и большинство регистраторов и экземпляр без аргументов. Это можно решить, установив initialize и создав экземпляр ActiveSupport::Logger, но, вероятно, это не правильное решение.

0

делегаты модели различного поведения Person на основе контекста. например тот же человек может быть продавцом в одном контексте или покупателем в другом контексте. Наследование более жесткое: a Bear и Tiger наследуют от Animal, но пример Animal никогда не должен будет иногда вести себя как Bear, а иногда и вести себя как Tiger. Экземпляр потомка Animal либо тот, либо другой.