【问题标题】:Is it possible to swap out nearly identical classes in Ruby?是否可以在 Ruby 中替换几乎相同的类?
【发布时间】:2016-04-18 23:42:39
【问题描述】:
class Parent
 def punish!
 end
end

class Mom < Parent
end

class Dad < Parent
end

如果我有一个Dad 的实例,但想使它成为Mom 的实例,这在Ruby 中是否可行?

【问题讨论】:

  • 为什么不可能?
  • @13aal 因为妈妈和爸爸可能有自己的方法和属性集。妈妈怎么变成爸爸了?
  • 什么时候换掉?你到底是什么意思?你的意思是如果你有一个妈妈对象,你能对它做点什么,让它成为爸爸吗?
  • 这样想吧。你有一个父母都是父母,所以在编程中他们都是从父类继承的。如果您担心它,您可以只创建一个从父类继承的类并将其命名为MomAndDad 或其他名称?

标签: ruby class inheritance metaprogramming


【解决方案1】:

如果“交换”是指在变量的上下文中替换:

parent = Mom.new
parent.punish!

parent = Dad.new
parent.punish!

您可以随时重新分配变量。你不能做的是将对象的实例从一个类转换为另一个类。一旦创建,它基本上就卡在那个类中了。

这里的相同原则适用于对象属性和其他可能保存对象引用的地方。

【讨论】:

  • >你不能做的是将对象的实例从一个类转换为另一个类。这就是我想要的。该死!
  • 它违背了大多数面向对象的设计模式。如果您需要的话,有一些方法可以使对象专门化并在创建后采取新的行为,或者您可以编写一个 Dad.to_mom 方法来发出相同的 Mom 版本。
  • 你需要的是一个父类,爸爸妈妈都继承自。然后任何期望父母的对象都会接受妈妈或爸爸。请参阅:多态性...
  • @AndyJones 这无助于将对象从一种类型切换到另一种类型。
  • @tadman -- 嗯,是的,关键是您不会将对象从 A 型切换到 B 型。您设计的系统可以互换地接受 A 型或 B 型。如果你能做到这一点,你将获得与将 A 切换到 B 相同的功能......
猜你喜欢
  • 2011-09-28
  • 2015-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多