Ruby接口类?

kid*_*rew 13 ruby oop

我有以下课程:

CachedObject
CachedObjectSource
CachedObjectDbSource < CachedObjectSource
CachedObjectDalliSource < CachedObjectSource
Run Code Online (Sandbox Code Playgroud)

CachedObject是一个非数据库对象,它从第三方API中提取并存储在本地.CachedObject将存储在数据库和Dalli(memcache)中,实时代码将ping Dalli源以获取对象的副本,并且Dalli源将搜索数据库源并在对象不存在时更新其缓存.所以它是一个嵌套调用,要求CachedObjectSource的每个子类实现相同的方法集.IE,一个界面.

有没有办法编写CachedObjectSource类,以便其子类必须实现接口?我是以错误的方式来做这件事的吗?

Hol*_*ust 19

Ruby不知道类似于Java的接口.相反,Ruby程序通常使用名为Duck Typing的方法,这基本上意味着您可以向任何对象发送任何消息,然后可以决定它是否会响应,即每个对象自己决定它具有哪些方法.

最接近"接口"的是实现方法的类(或模块),但只提出NotImplementedError类似于此的方法:

class CachedObjectSource
  def my_method
    raise NotImplementedError, "Implement this method in a child class"
  end
end
Run Code Online (Sandbox Code Playgroud)

这样,该方法将存在并在被调用时返回合理的错误,而不会在子类中被覆盖.然后,您应该编写一些文档,明确哪些子类必须实现符合要求.

  • 当然,最后,它只是一个额外的暗示,应该有一个方法实现,一个`NoMethodError`默认具有与'NotImplementedError`相同的含义.但是,该类的用户可以在代码中看到它们需要实现的内容并获得更清晰的错误消息.最后,它或多或少是显性与隐性的问题(而我更倾向于事物的明确方面). (3认同)
  • 如果您想提供有关必须实现的方法的更多信息,我想使用以下行:`fail NotImplementedError,"#{self.class} ## {__ method__}方法必须实现"` (3认同)