我知道抽象类在Ruby中不是一个特性,这背后肯定有一个哲学上的原因,但我想知道是否有办法解决在其他语言(如C++和Java)中通常使用抽象类解决的问题。举例来说:我需要三个类Triangle、Square和Circle,因为这些都是几何图形,所以我想用一个抽象方法get_area来编写一个名为AbstractFigure的抽象类,它将由具体类Triangle、Square和Circle实现。如何遵循Ruby哲学?
Triangle
Square
Circle
get_area
AbstractFigure
dohp0rv51#
你是对的,它在ruby中并不是一个定义良好的概念,不像其他语言,如Java,它被大量使用。但你也是对的,有很多情况下需要这样做。我是这样做的,以你为榜样-
class AbstractShape attr_accessor :edges def initialize # ... end def get_area raise NoMethodError("Override this implementation") endendclass Square < AbstractShape def initialize # square-specific stuff super end def get_area self.edges * foo * bar endend
class AbstractShape
attr_accessor :edges
def initialize
# ...
end
def get_area
raise NoMethodError("Override this implementation")
class Square < AbstractShape
# square-specific stuff
super
self.edges * foo * bar
字符串关键是为了可读性和一致性,在顶层定义所有可用的方法,但要确保它们在使用时会引发错误。如果有一种方法,您绝对确定它将以相同的方式在所有形状中一致地使用,那么请在AbstractShape中定义它attr_accessor也将继承,因此您将在每个示例的基础上为每个形状提供@edges。但是您仍然可以在AbstractShape类中引用@edges的方法,因为它们将使用正确的本地示例变量。
AbstractShape
attr_accessor
@edges
w8f9ii692#
定义一个普通类AbstractFigure,它的方法get_area只引发NotImplementedError。然后每个派生类都用自己的实现覆盖get_area方法。
NotImplementedError
class AbstractFigure def get_area raise NotImplementedError.new( 'appropriate error message' ) endendclass Square < AbstractFigure def get_area # implementation here endend
class AbstractFigure
raise NotImplementedError.new( 'appropriate error message' )
class Square < AbstractFigure
# implementation here
字符串
2条答案
按热度按时间dohp0rv51#
你是对的,它在ruby中并不是一个定义良好的概念,不像其他语言,如Java,它被大量使用。
但你也是对的,有很多情况下需要这样做。
我是这样做的,以你为榜样-
字符串
关键是为了可读性和一致性,在顶层定义所有可用的方法,但要确保它们在使用时会引发错误。
如果有一种方法,您绝对确定它将以相同的方式在所有形状中一致地使用,那么请在
AbstractShape
中定义它attr_accessor
也将继承,因此您将在每个示例的基础上为每个形状提供@edges
。但是您仍然可以在AbstractShape
类中引用@edges
的方法,因为它们将使用正确的本地示例变量。w8f9ii692#
定义一个普通类
AbstractFigure
,它的方法get_area
只引发NotImplementedError
。然后每个派生类都用自己的实现覆盖get_area
方法。字符串