悄悄地换课?在Ruby中可能吗
我为技术绘图解决方案开发课程。我必须使用几何原语。例:悄悄地换课?在Ruby中可能吗,ruby,class,Ruby,Class,我为技术绘图解决方案开发课程。我必须使用几何原语。例: # 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
# 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
是否有可能返回一个椭圆
(有点像:“接受的东西要自由……”Jon Postel的稳健性原则)
我认为只要包含椭圆
就可以了,因为圆和椭圆或多或少是相等的,我没有试过,但这会改变类.name
,如果我这样做(在Ruby中)会发生什么?是的,你可以(在圆
类中,只需添加以下内容):
def Circle.new(x,y,w,h)
if w != h
Ellipse.new x,y,w,h
else
super
end
end
关键是,是的,就像你说的,这是非常糟糕的做法。在这种情况下,你可以把事情组织得更好一点,你通常不应该以写这样一篇文章而告终。下面是一个例子:
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
类椭圆
def初始化(x,y,w,h=w)
#(x,y)是原点
#w=宽度,h=高度
# ...
终止
终止
类圆<椭圆
def初始化(x、y、d)
#(x,y)是原点
#d=直径
# ...
超级x,y,d,d
终止
终止
事实上,圆是椭圆的特例。通过执行上述操作,您可以通过在Circle#initialize
方法中专门化eliple
的构造函数来说明问题。是的,您可以(在Circle
类中只需添加以下内容):
关键是,是的,就像你说的,这是非常糟糕的做法。在这种情况下,你可以把事情组织得更好一点,你通常不应该以写这样一篇文章而告终。下面是一个例子:
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
类椭圆
def初始化(x,y,w,h=w)
#(x,y)是原点
#w=宽度,h=高度
# ...
终止
终止
类圆<椭圆
def初始化(x、y、d)
#(x,y)是原点
#d=直径
# ...
超级x,y,d,d
终止
终止
事实上,圆是椭圆的特例。通过上述操作,您可以通过在
圆#initialize
方法中专门化椭圆
的构造函数来明确说明问题。我认为这没有意义。因为这些只是在这些维度上有所不同,所以我不认为有必要再开设一门课程。一个圆是一个椭圆。@Ross:是的,它是,计算一个圆的面积,认为它是一个A=b的椭圆,这是很昂贵的,而且使用“如果”会破坏OO。我认为即使在SVG中也有一个和一个tagOK的原因,那么继承就是答案!(就像杰弗里下面的回答)我认为这没有意义。因为这些只是在这些维度上有所不同,所以我不认为有必要再开设一门课程。一个圆是一个椭圆。@Ross:是的,它是,计算一个圆的面积,认为它是一个A=b的椭圆,这是很昂贵的,而且使用“如果”会破坏OO。我认为即使在SVG中也有一个和一个tagOK的原因,那么继承就是答案!(就像下面Jeffrey的回答)这是一个非常简短的答案,看起来对我来说是正确的,所以我必须自己解释:我重写类Circle的“new”操作符,返回一个Circle实例或Ellipse?Em实例。。您应该了解有关Class.new如何工作的更多信息。阅读David Flanagan和松本幸弘(语言创建者)的《Ruby编程语言》(the Ruby programming language)一书。但说真的,读这本书注意:在真实代码中不要使用相同的技巧;):-我应该得到更多关于ruby如何工作的信息!从C++和PHP中,它经常引起我的大脑中的结,我会读它。这是一个真实的简短答案,看起来对我来说是正确的,所以我必须解释它:我自己:重写类圆的“新”操作符,返回以太循环的实例或椭圆的实例。您应该了解有关Class.new如何工作的更多信息。阅读David Flanagan和松本幸弘(语言创建者)的《Ruby编程语言》(the Ruby programming language)一书。但说真的,读这本书注意:在真实代码中不要使用相同的技巧;):-我应该得到更多关于ruby如何工作的信息!从C++和PHP中,它经常引起我的大脑中的结,我会读它。SRY,我的问题是理解Ruby,而不是OO。在我的例子中,“圆”和“椭圆”的所有方法都是不同的,将其子类化是一个acadmic问题,不应该(IMHo)成为这项任务的重点。但是谢谢你的例子。这让我的问题更清楚:如果我得到一个h=w的椭圆,我应该返回一个“圆”来保持低计算。在这种情况下,这个糟糕的“黑客”开始变得有意义:--)-“你需要知道规则,打破规则”lama.sry,我的问题是为了理解Ruby,而不是OO。在我的例子中,“圆”和“椭圆”的所有方法都是不同的,将其子类化是一个acadmic问题,不应该(IMHo)成为这项任务的重点。但是谢谢你的例子。这让我的问题更清楚:如果我得到一个h=w的椭圆,我应该返回一个“圆”来保持低计算。在这种情况下,这种糟糕的“黑客”开始变得有意义:--)-“你需要知道规则,打破规则,纠正错误”喇嘛。