【发布时间】:2015-12-22 04:00:40
【问题描述】:
我有一个子类,我想为一组方法实现一些默认行为,例如,如果我知道我需要重写该方法,但如果该方法尚不支持,现在只想打印一个警告在这个特定的子类上。
我可以像这样覆盖子类中的每个方法,但我想知道是否有更简单的方法,可能使用委托或 method_missing?
class Foo
def method_a
# do foo stuff
end
def method_b
# do foo stuff
end
def method_c
# do foo stuff
end
end
class Bar < Foo
def not_yet_supported
puts "warnnig not yet supported"
end
def method_b
not_yet_supported
end
end
【问题讨论】:
-
为什么不在
Foo类中将这些方法定义为not_yet_supported? -
alias可以帮到你吗? -
@sawa 我或多或少地将其用于类似复合的模式。 Foo 的大多数方法都可以在 Bar 实例上调用,但有些方法在 Bar 实例上调用没有意义,所以对于那组方法,我想打印一个警告(或者可能引发异常)。所以我真的只是在寻找一种 DRYer 方法(并不是说用一个衬里实现每种方法都那么糟糕)。
-
“调用 Bar 实例的某些方法没有意义” - 如果这是真的,继承在这里可能不是一个好的选择。子类应该是其超类的特化。如果它们只有一些重叠的行为,那么通过模块进行组合可能会更好。
-
@Kristján 我不同意您的评论,但在复合材料中,叶子和复合材料的界面应该相同,但行为可能会有所不同,这基本上就是我在这里所做的。某些方法在复合与叶子上调用时不会做任何事情,我只是在寻找一种方法将所有这些方法名称分组到一个列表中,然后调用一些常见的功能(如警告)。