用Ruby实现抽象类解决方案的正确方法是什么?

u91tlkcl  于 4个月前  发布在  Ruby
关注(0)|答案(2)|浏览(57)

我知道抽象类在Ruby中不是一个特性,这背后肯定有一个哲学上的原因,但我想知道是否有办法解决在其他语言(如C++和Java)中通常使用抽象类解决的问题。
举例来说:我需要三个类TriangleSquareCircle,因为这些都是几何图形,所以我想用一个抽象方法get_area来编写一个名为AbstractFigure的抽象类,它将由具体类TriangleSquareCircle实现。
如何遵循Ruby哲学?

dohp0rv5

dohp0rv51#

你是对的,它在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的方法,因为它们将使用正确的本地示例变量。

w8f9ii69

w8f9ii692#

定义一个普通类AbstractFigure,它的方法get_area只引发NotImplementedError。然后每个派生类都用自己的实现覆盖get_area方法。

class AbstractFigure
    def get_area
        raise NotImplementedError.new( 'appropriate error message' )
    end
end

class Square < AbstractFigure
    def get_area
        # implementation here
    end
end

字符串

相关问题