Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
悄悄地换课?在Ruby中可能吗_Ruby_Class - Fatal编程技术网

悄悄地换课?在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的椭圆,我应该返回一个“圆”来保持低计算。在这种情况下,这种糟糕的“黑客”开始变得有意义:--)-“你需要知道规则,打破规则,纠正错误”喇嘛。