我知道抽象类不是 Ruby中的一个特性,当然背后有一个哲学原因,但我想知道是否有办法解决通常使用其他语言(如C和Java)中的抽象类来解决的问题. 例如: 我需要三个班级Triangle,Square和C
例如:
我需要三个班级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的方法,因为它们只会使用正确的本地实例变量.