Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 未实现方法的默认行为?_Ruby_Oop - Fatal编程技术网

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