2

我为技术绘图解决方案开发课程。我必须使用几何图元。前任:

# all specifications are left, bottom and width, height
class Circle
                      #  +--- this is for my later question
                      #  v 
   def initialize(x,y,w,h=w) # left, bottom and w=x+2*radius
      ...
   end
end
# the Ellipse needs 4 specifications (no rotation here)
class Ellipse
   def initialize(x,y,w,h) # left, bottom and w=2*a, h=2*b
      ...
   end
end

如果有人会使用类似的东西

primitive=Cricle.new(10,10,20,30) # note different width and height 

是否有可能返回 a Ellipse(有点像:'对你接受的东西保持自由......' Jon Postel 的稳健性原则)?

我认为这include Ellipse应该可以解决问题,因为 Circle 和 Ellibse 或多或少是相等的,所以我没有尝试过,但是class.name如果我这样做会改变吗?(在 Ruby 中)会发生什么?

4

2 回答 2

3

是的,你可以(在Circle课堂上只需添加以下内容):

def self.new(x, y, w, h)
  return Ellipse.new(x, y, w, h) if w != h
  super
end

关键是,是的,就像你说的那样,这是非常糟糕的做法。在这种情况下,您可以更好地组织事情,并且您通常永远不应该最终编写这样的 hack。这是一个例子:

class Ellipse
    def initialize(x, y, w, h = w)
        # (x, y) is the origin point
        # w = width, h = height
        # ...
    end
end

class Circle < Ellipse
    def initialize(x, y, d)
        # (x, y) is the origin point
        # d = diameter
        # ...
        super x, y, d, d
    end
end

事实上,圆是椭圆的特例。通过执行上述操作,您可以通过专门化方法中的构造函数来明确Ellipse说明Circle#initialize

于 2013-08-04T20:20:55.760 回答
1
def Circle.new(x,y,w,h)
  if w != h
    Ellipse.new x,y,w,h
  else
    super
  end
end
于 2013-08-04T19:54:20.760 回答