Kyl*_*cot 12 ruby inheritance delegation
有人可以提供一些见解,了解何时通过DelegateClass(例如Seller < DelegateClass(Person))使用委托以及何时Seller < Person在ruby中使用类继承(例如)?
class Seller < DelegateClass(Person)
def sales
...
end
end
class Seller < Person
def sales
...
end
end
Run Code Online (Sandbox Code Playgroud)
当我在Github上查看Ruby on Rails源代码时,我发现了很多用途DelegateClass.
有一些差异可以帮助提供有关使用哪种方法的见解.
1)您可以安全地委托给基元(例如String),但不能总是安全地从它们继承
如果你在上面建造Hash或String或者Fixnum,你是更安全的使用DelegateClass(或其他委托).有关原因的更多信息,Steve Klabnik的警告是一个很好的起点).
2)DelegateClass可以很容易地将更通用的对象"转换"为更具体的对象
这样可以更容易地接受一般对象的实例,并使其以特定于您的实现的方式运行:
class Message < DelegateClass(String)
def print
upcase
end
end
# […]
def log(message)
message = Message.new(message) unless message.is_a?(Message)
end
Run Code Online (Sandbox Code Playgroud)
3)一个陷阱:DelegateClass子类期望委托类的实例作为参数new
这可能会使您将要传递给库代码的类"子类化"变得棘手.例如,这是一种相当普遍的做法,不会开箱即用DelegateClass:
class MyLogger < DelegateClass(ActiveSupport::Logger); end
Foo::ThirdParty::Library.configure do |c|
c.logger = MyLogger # no good
end
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为我们的库期望像大多数记录器一样运行并且不带参数进行实例化.这可以通过定义initialize和创建一个实例来解决ActiveSupport::Logger,但在这种情况下可能不是正确的解决方案.
| 归档时间: |
|
| 查看次数: |
1477 次 |
| 最近记录: |