当前位置 : 主页 > 编程语言 > ruby >

使用Ruby处理抽象类解决方案的正确方法是什么?

来源:互联网 收集:自由互联 发布时间:2021-06-23
我知道抽象类不是 Ruby中的一个特性,当然背后有一个哲学原因,但我想知道是否有办法解决通常使用其他语言(如C和Java)中的抽象类来解决的问题. 例如: 我需要三个班级Triangle,Square和C
我知道抽象类不是 Ruby中的一个特性,当然背后有一个哲学原因,但我想知道是否有办法解决通常使用其他语言(如C和Java)中的抽象类来解决的问题.

例如:
我需要三个班级Triangle,Square和Circle.因为这些都是几何图形,所以我在考虑使用抽象方法get_area编写一个名为AbstractFigure的抽象类,它将由具体类Triangle,Square和Circle实现.

我如何按照Ruby哲学做到这一点?

你是对的,它在ruby中并不像一个明确定义的概念那样存在,不像其他语言如Java那样被大量使用.

但你也是对的,有很多情况需要它.

以下是我的例子 – 用你的例子 –

class AbstractShape
  attr_accessor :edges

  def initialize
    # ...
  end

  def get_area
    raise NoMethodError("Override this implementation")
  end
end


class Square < AbstractShape
   def initialize
     # square-specific stuff
     super
   end

   def get_area
     self.edges * foo * bar
   end
end

关键是要在顶层定义所有可用的方法以提高可读性和一致性,但要确保它们在使用时引发错误.

如果有一种方法绝对肯定会在所有形状中以相同的方式使用,那么在AbstractShape中定义它

attr_accessor也将继承,因此每个形状的每个实例都有@edges可用.但是你仍然可以在AbstractShape类中引用引用@edges的方法,因为它们只会使用正确的本地实例变量.

网友评论