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

u91tlkcl  于 2024-01-07  发布在  Ruby
关注(0)|答案(2)|浏览(213)

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

dohp0rv5

dohp0rv51#

你是对的,它在ruby中并不是一个定义良好的概念,不像其他语言,如Java,它被大量使用。
但你也是对的,有很多情况下需要这样做。
我是这样做的,以你为榜样-

  1. class AbstractShape
  2. attr_accessor :edges
  3. def initialize
  4. # ...
  5. end
  6. def get_area
  7. raise NoMethodError("Override this implementation")
  8. end
  9. end
  10. class Square < AbstractShape
  11. def initialize
  12. # square-specific stuff
  13. super
  14. end
  15. def get_area
  16. self.edges * foo * bar
  17. end
  18. end

字符串
关键是为了可读性和一致性,在顶层定义所有可用的方法,但要确保它们在使用时会引发错误。
如果有一种方法,您绝对确定它将以相同的方式在所有形状中一致地使用,那么请在AbstractShape中定义它
attr_accessor也将继承,因此您将在每个示例的基础上为每个形状提供@edges。但是您仍然可以在AbstractShape类中引用@edges的方法,因为它们将使用正确的本地示例变量。

展开查看全部
w8f9ii69

w8f9ii692#

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

  1. class AbstractFigure
  2. def get_area
  3. raise NotImplementedError.new( 'appropriate error message' )
  4. end
  5. end
  6. class Square < AbstractFigure
  7. def get_area
  8. # implementation here
  9. end
  10. end

字符串

相关问题