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
class AbstractFigure
def get_area
raise NotImplementedError.new( 'appropriate error message' )
end
end
class Square < AbstractFigure
def get_area
# implementation here
end
end
2条答案
按热度按时间dohp0rv51#
你是对的,它在ruby中并不是一个定义良好的概念,不像其他语言,如Java,它被大量使用。
但你也是对的,有很多情况下需要这样做。
我是这样做的,以你为榜样-
字符串
关键是为了可读性和一致性,在顶层定义所有可用的方法,但要确保它们在使用时会引发错误。
如果有一种方法,您绝对确定它将以相同的方式在所有形状中一致地使用,那么请在
AbstractShape
中定义它attr_accessor
也将继承,因此您将在每个示例的基础上为每个形状提供@edges
。但是您仍然可以在AbstractShape
类中引用@edges
的方法,因为它们将使用正确的本地示例变量。w8f9ii692#
定义一个普通类
AbstractFigure
,它的方法get_area
只引发NotImplementedError
。然后每个派生类都用自己的实现覆盖get_area
方法。字符串