2011-11-06 34 views
0

我正在使用RS232 pinpad,并且想要为它创建一个继承自serialport gem的类,以便我可以使用serialport gem公开的方法,例如each_byte,同时抽象出写入到pinpad的LCD时的一些细节。由于类方法,Ruby对象的初始化方法永远不会触发

我遇到的问题是serialport gem定义了一个名为new的类方法,它似乎阻止了我的initialize方法的触发。

class SerialPort 
    def SerialPort::new(port, *params) 
     #some code here 
    end 
end 

 

require 'serialport' 
class Pinpad < SerialPort 
    attr_reader :test 
    def initialize 
     @test = "success" 
    end 
end 

kp = Keypad.new() 
puts kp.x #should be "success", will be nil 

我试图定义我自己的类方法命名为新def Pinpad::new这至少让我重写SerialPort::new方法,但它仍然不会使代码在我initialize方法开火。

我是Ruby的新手,所以解决方案可能是微不足道的,但我真的很感谢这个帮助。

+1

呼叫从''new' initialize'? –

+2

你确定继承是正确的方法吗? Pinpad是不是一个*有串行端口而不是*是串行端口的设备? –

+0

@mu引脚板是连接到串行端口的设备。我使用继承的原因是,读取和写入它可以像写入标准串行端口一样完成,但是我想抽象写入方法,以便我可以调用'pinpad.write_line(0, “some text”)''而不是'serialport.write(“\ eS0some text .......”)'但是如果你知道更好的设计模式,我愿意接受建议 – mcourtney

回答

0

我发现forwardable模块,它做什么,我想

require 'serialport' 
require 'forwardable' 

Class Pinpad 
    extend Forwardable 
    def_delegator @sp, :each_byte, :each_byte 

    def initialize 
     @sp = SerialPort.new("/dev/ttyS0") 
    end 
end 

pp = Pinpad.new() 
pp.each_byte { |byte| puts byte.chr } 
0

一个可能的解决方案是在子类中重新定义self.new:Code Size and Dynamic Languages

def self.new(*args) 
    super 
    object = self.allocate 
    object.send :initialize, *args 
    object 
end 

理念从借来的。这可能不是最好的解决方案,但在我看来,它似乎工作。由于上文在评论你的帖子时所说的mu太短,这看起来似乎是组合而不是继承的更好场合。

相关问题