【问题标题】:Initializing a subclass of `Time`初始化 `Time` 的子类
【发布时间】:2013-02-07 04:48:50
【问题描述】:

我想创建一个Time 的子类,比如说MyTime,这样我就可以定义(尤其是与格式相关的)方法而不会污染Time 类。

class MyTime < Time; end

对于Time上定义的一些构造方法,我可以像这样在MyTime中使用它们:

MyTime.now

但有时我需要基于Time 的实例创建MyTime 的实例。例如,我想有一个 MyTime 的实例,基于:

File.mtime(path_to_some_file)

这是一个Time 实例。构造函数Time#new 不接受Time 实例,所以我不能使用它。我该怎么做?

【问题讨论】:

  • 你能用组合代替继承吗? MyTime 可以简单地持有Time 类的一个实例并将所有调用委托给它,这可能是一个更冗长的实现;但它会给你File.mtime(...)所需的灵活性
  • @HunterMcMillen 如果这是唯一的方法,那将是最后的手段,但如果可能的话,我想避免这种情况。

标签: ruby time


【解决方案1】:

Time 类有一个 at 类方法,该方法将 Time 实例作为参数:

在(时间)→ 时间
[...]

time, [...]

给定的值创建一个新的时间对象

所以你可以这样说:

>> class MyTime < Time; end
>> mt = MyTime.at(File.mtime(path_to_some_file))
>> mt.class
=> MyTime

因此,将Time 转换为MyTime 只需调用MyTime.at

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-21
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多