Ruby中的DelegateClass与类继承

bwntbbo3  于 2023-04-11  发布在  Ruby
关注(0)|答案(2)|浏览(130)

有没有人能提供一些关于什么时候使用DelegateClass委托(例如Seller < DelegateClass(Person))以及什么时候使用ruby中的类继承(例如Seller < Person)的见解?

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

class Seller < Person 
  def sales
     ...
  end 
end
r7knjye2

r7knjye21#

有几个差异可以帮助您了解使用哪种方法。

1)你可以安全地委托给原语(例如String),但不能总是安全地继承它们

如果你是在HashStringFixnum的基础上构建,那么使用DelegateClass(或其他委托者)会更安全。

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)一个gotcha:DelegateClass子类需要委托类的示例作为new的参数

这可能会使您将类“子类化”到库代码中变得棘手。例如,这是一个相当常见的做法,但在DelegateClass中无法开箱即用:

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

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

这不起作用,因为我们的库期望像大多数记录器一样运行,并且不带参数地示例化。这可以通过定义initialize并创建ActiveSupport::Logger的示例来解决,但在这种情况下可能不是正确的解决方案。

pvcm50d1

pvcm50d12#

delegates根据上下文对Person的不同行为进行建模。例如,同一个人可能在一个上下文中是卖家,也可能在另一个上下文中是买家。继承更加严格:BearTiger继承自Animal,但Animal的示例永远不需要有时表现得像Bear,有时表现得像TigerAnimal的后代的示例是其中之一。

相关问题