对具有"工厂"的类进行子类化方法

时间:2016-02-17 22:52:06

标签: ruby

我有一个班级有一个"工厂"给定file_name返回新实例的方法。根据给定的文件类型,它需要以不同方式构造对象。它也恰好是一个包含c ++类的swig生成的类,我不确定这很重要,但是我将这个细节包括在内以防万一。所以我在某个地方定义了这个类,其中包括这个new_from_file方法

class Wv::WvWaveList 
  def self.new_from_file file_name
     ... 
      Wv::WaveList.new
  end
  ....
end

我想添加一个方法copy_wave,所以我的第一个想法是将其子类化并添加到那里,就像这样。

class MyWaveList < Wv::WvWaveList
  def copy_wave
    ...        
  end
end

问题是new_from_file仍然返回Wv :: WaveList而不是MyWaveList,因此我无法在copy_wave返回的实例上调用new_from_file

一个简单的解决方案就是在这里打开课程并添加方法

class Wv::WvWave
  def copy_wave
     ...
  end
end

另一个解决方案是让MyWaveList拥有一个Wv :: WaveList的实例,并将所有适当的调用委托给该实例。

所以我只是想知道继承解决方案可能是什么?我现在还没有看到它。

1 个答案:

答案 0 :(得分:1)

我相信这应该有用

class Wv::WvWaveList 
  def self.new_from_file file_name
    ... 
    self.new
  end
  ....
end

因为self.new_from_file总是调用Wv::WaveList.new,所以它始终使用该类实例化对象,即使是从子类。但是通过使用self,您将能够在任何子类上调用new_from_file,并且对象将是正确的类:

>> a = MyWaveList.new_from_file "some_file"
=> #<MyWaveList:0x007fd473004318 @file_name="some_file">
>> a.class
=> MyWaveList