Ruby 未实现方法的默认行为?
我有一个子类,我想为一组方法实现一些默认行为,例如,如果我知道我需要重写该方法,但现在只想打印一条警告,如果该方法在这个特定的子类上还不受支持 我可以覆盖子类中的每个方法,就像这样,但我想知道是否有更简单的方法,可能使用委托或方法Ruby 未实现方法的默认行为?,ruby,oop,Ruby,Oop,我有一个子类,我想为一组方法实现一些默认行为,例如,如果我知道我需要重写该方法,但现在只想打印一条警告,如果该方法在这个特定的子类上还不受支持 我可以覆盖子类中的每个方法,就像这样,但我想知道是否有更简单的方法,可能使用委托或方法 class Foo def method_a # do foo stuff end def method_b # do foo stuff end def method_c # do foo stuff end
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
class-Foo
定义方法a
#做食物
结束
def方法b
#做食物
结束
def方法c
#做食物
结束
结束
类Bar
按照注释中的建议使用是一种简单的方法,看起来
alias method_b not_yet_supported
alias_method :method_c, :not_yet_supported
注意语法上的差异,因为alias
是一个关键字,alias\u method
是一个方法
如果您想声明一系列不受支持的方法,只需进行一点元编程即可:
class Foo
def self.not_yet_supported(*method_names)
method_names.each do |method_name|
define_method method_name do
puts "#{method_name} is not yet supported on #{self.class.name}"
end
end
end
not_yet_supported :bar, :baz
end
更清洁的方法是使用:
对于
method\u missing
也可以找到一个更友好的解释为什么不在类Foo
中将这些方法定义为not\u supported
?alias可以帮助您吗?@sawa I在类似复合模式中或多或少地使用它。Foo的大多数方法都可以在Bar实例上调用,但是有些方法在Bar实例上调用是没有意义的,所以对于这组方法,我想打印一条警告(或者引发一个异常)。所以我真的只是在寻找一种更干练的方法(并不是说用一行程序实现每个方法都那么糟糕)。“有些方法调用Bar实例是没有意义的”——如果这是真的,那么继承在这里可能不是一个好的选择。子类应该是其超类的特化。如果它们只有一些重叠的行为,通过模块组合可能会更好。@Kristján我不反对你的评论,但在复合中,叶子和复合的界面应该相同,但行为可能不同,这基本上就是我在这里做的。某些方法在复合和叶上调用时不会起任何作用,我只是想找到一种方法,将所有这些方法名称分组到一个列表中,然后调用一些常见的功能(如警告)。我忘记了define_方法
class Foo
UNIMPLEMENTED_METHODS = [:method_a, :method_b, :method_etc]
def method_missing(method_id)
UNIMPLEMENTED_METHODS.include?(method_id) ? warn("#{method_id} has not been implemented") : raise(NoMethodError)
end
end