我有一个班级有一个"工厂"给定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的实例,并将所有适当的调用委托给该实例。
所以我只是想知道继承解决方案可能是什么?我现在还没有看到它。
答案 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