Ruby 中的继承与实例化

波盎司

我仍然很困惑什么时候最好从另一个类继承,或者当你最好返回另一个类的新实例时,最好的方法是什么。目的是获得一种可链接的方式来创建各种类型的按钮。这是一些示例代码:

class Button
  def initialize link
    @link = link
  end

  def color(color)
    @color = color
    return self
  end
end

# Now I'm wondering what is the best approach to do something like:

class RedButton < Button
  def initialize link
    super
    color('red')
  end
end

# or

class Redbutton
  def initialize link
    return Button.new(link).color('red')
  end
end

或者这基本上是一样的?

轴心

类是用于创建对象的蓝图。实例化创建类的新实例(新对象)。继承创建一个新的类,即一个新的蓝图。它们是不同的概念。

第二个例子并不像你想象的那样工作。initialize方法是在类的构造函数。new当创建新实例时,它由类方法调用它不能返回一个值(好吧,它总是返回一个值,但它被忽略了)。

Redbutton第二个例子类是新的空类,与任何不相关Button的类。它的构造函数创建Button该类的一个新实例并返回它,但返回的对象没有存储在任何地方,它在下一个垃圾收集周期被解释器销毁。

第二个Redbutton类是相同的:

class Redbutton
  def initialize link
  end
end

类的第一个实现Redbutton(扩展的那个Button)在语义上是正确的。它创建了一个在创建过程中将Button@color属性设置为对象'red'


更新(对评论中发布的问题的回答)

最好的方法取决于很多因素。您会在处理项目时发现它。如果RoundButtonSquareButton提供与基类 ( )不同的功能Button那么为它们创建单独的类是有意义的。如果您还需要RedRoundButton(扩展什么类?RedButtonRoundButton?),您会遇到挑战,并且您会发现很多时候继承不是解决方案。

但是,如果RedButton之间的唯一区别Button一个字段(或多个字段)的值,那么您最好在类Button(或工厂类)中创建一个工厂方法,该方法知道如何创建和初始化红色按钮、圆形按钮、红色按钮圆形按钮等,例如:

class Button
  def initialize link
    @link = link
  end

  def color(color)
    @color = color
    self
  end

  def shape(shape)
    @shape = shape
    self
  end

  def self.create(type, link)
    case type
    when 'RedButton'
        self.new(link).color('red')
    when 'RoundButton'
        self.new(link).shape('round')
    when 'RedRoundButton'
        self.new(link).color('red').shape('round')
    else
        raise 'Unknown type'
    end
  end
end

x = Button.create('RedButton', 4)
y = Button.create('RedRoundButton', 6)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何摆脱“新”实例化Ruby对象?

来自分类Dev

在Ruby中阻止静态函数的继承

来自分类Dev

检查Ruby中实例的类型

来自分类Dev

如何在Ruby中通过变量实例化对象?

来自分类Dev

Ruby on Rails继承语法

来自分类Dev

Ruby:实例化一个块中的新变量

来自分类Dev

在Ruby中以单例实例化对象一次

来自分类Dev

原型继承与实例化

来自分类Dev

Ruby中的继承

来自分类Dev

如何在Ruby中调用实例变量

来自分类Dev

Ruby:列出未从其基础继承的对象的实例变量

来自分类Dev

Ruby中的DelegateClass与类继承

来自分类Dev

Ruby继承-子实例只有父属性

来自分类Dev

如何在Ruby中覆盖实例方法

来自分类Dev

防止在Ruby中继承

来自分类Dev

Ruby MRI中的线程安全实例变量

来自分类Dev

Ruby中的类级别实例变量

来自分类Dev

Ruby on Rails继承语法

来自分类Dev

在Ruby中,使用“ def initialize(value =”)”初始化类实例有什么好处?

来自分类Dev

Ruby-遍历实例

来自分类Dev

Ruby on Rails中模型的继承

来自分类Dev

子类中的Ruby类实例变量

来自分类Dev

如何在此代码中避免Ruby Thread对象的连续实例化?

来自分类Dev

在Ruby OOP中访问实例变量

来自分类Dev

删除Ruby中的类实例

来自分类Dev

如何在Ruby中迭代包含实例化对象信息的哈希数组?

来自分类Dev

如何从 Ruby 中的实例方法访问模块?

来自分类Dev

尝试 ruby 继承

来自分类Dev

类中的 Ruby 实例变量?