2011-11-06 32 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太短,這看起來似乎是組合而不是繼承的更好場合。

相關問題