有没有人能提供一些关于什么时候使用DelegateClass
委托(例如Seller < DelegateClass(Person)
)以及什么时候使用ruby中的类继承(例如Seller < Person
)的见解?
class Seller < DelegateClass(Person)
def sales
...
end
end
class Seller < Person
def sales
...
end
end
- 当我在Github上查看Ruby on Rails源代码时,我发现了很多uses of
DelegateClass
。*
2条答案
按热度按时间r7knjye21#
有几个差异可以帮助您了解使用哪种方法。
1)你可以安全地委托给原语(例如String),但不能总是安全地继承它们
如果你是在
Hash
或String
或Fixnum
的基础上构建,那么使用DelegateClass
(或其他委托者)会更安全。2)DelegateClass可以很容易地将更一般的对象“转换”为更具体的对象
这使得更容易接受一个通用对象的示例,并使其以特定于您的实现的方式运行:
3)一个gotcha:
DelegateClass
子类需要委托类的示例作为new
的参数这可能会使您将类“子类化”到库代码中变得棘手。例如,这是一个相当常见的做法,但在
DelegateClass
中无法开箱即用:这不起作用,因为我们的库期望像大多数记录器一样运行,并且不带参数地示例化。这可以通过定义
initialize
并创建ActiveSupport::Logger
的示例来解决,但在这种情况下可能不是正确的解决方案。pvcm50d12#
delegates根据上下文对
Person
的不同行为进行建模。例如,同一个人可能在一个上下文中是卖家,也可能在另一个上下文中是买家。继承更加严格:Bear
和Tiger
继承自Animal
,但Animal
的示例永远不需要有时表现得像Bear
,有时表现得像Tiger
。Animal
的后代的示例是其中之一。