【发布时间】:2015-06-24 13:08:13
【问题描述】:
我承认在鸭式语言中,抽象类并不经常使用,所以这个问题更多是出于好奇而不是实际需要:
在 Ruby(至少 2.0)中,Fixnum 和 Bignum 有一个共同的超类,称为 Integer。在我看来,这是一个抽象类;至少,它不能被实例化,即当你在 irb 中这样做时:
irb(main):047:0> Integer.new(8)
NoMethodError: undefined method `new' for Integer:Class
from (irb):47
from /usr/bin/irb:12:in `<main>'
现在,如果我决定推出自己的类,其行为类似于 Integer,即“像 Integer 一样抽象”,我会怎么做?我认为 每个 类都包含一个(隐藏的)new 方法(如果存在,它将调用我的 initialize 方法)。
【问题讨论】:
-
像这样严格执行的抽象基类确实违背了通常的 Ruby 风格。如果你真的,真的需要对人们实例化你的类感到讨厌:
def initialize; raise "Nope"; end然后让子类重新定义它。 -
我认为这不能回答我的问题。或者,Ruby 的整数类是否有可能引发“NoMethodError:未定义的方法‘新’”?如果是这种情况,我认为堆栈跟踪将显示“初始化”作为异常的来源,不是吗?
-
@BinaryMee:这也不能解释我得到的例外的措辞。
标签: ruby