2013-03-12 40 views
0

我有幾個類,我希望每個類都在類級別上維護爲未來查找而創建的所有實例的哈希。一些類似於:在Ruby中抽象/生成類層次結構變量

class A 
    def initialize(id, otherstuff) 
    # object creation logic 
    @@my_hash[id]=self 
    end 

    def self.find(id) 
    @@my_hash[id] 
    end 
end 

這樣我就可以再A.find(id),並得到正確的實例回來。

有幾個這些類(A,B等),都有ID,我想要這些功能。

我可以讓它們都從一個超類中繼承,它有一個它可以利用的通用版本,所以我不必爲每個類重新實現很多東西?

+0

,如果你想跟蹤的範圍,那麼你不需要一個哈希存儲自我,你可以使用父類的方法,或者你可以直接使用object.class – sunny1304 2013-03-12 16:19:00

回答

0

是的,你可以從同一個超類繼承,或使用模塊和include:如果你想保持獨立的索引每個子類

module M 
    def initialize(id) 
    @@all ||= {} 
    @@all[id] = self 
    end 

    def print 
    p @@all 
    end 
end 

class C 
    include M 
    def initialize(id) 
    super 
    puts "C instantiated" 
    end 
end 

,你可以這樣做:

def initialize(id) 
    @@all ||= {} 
    @@all[self.class] ||= {} 
    @@all[self.class][id] = self 
end 

編輯:在您發表評論後,我發現您需要保留每個級別的索引。所以:

class A 
    def initialize(id) 
    self.class.index(id, self) 
    end 

    def self.index id, instance 
    @all ||= {} 
    @all[id] = instance 
    end 

    def self.find(id) 
    @all[id] 
    end 
end 

class B < A 
end 

class C < A 
end 

a = A.new(1) 
b = B.new(2) 
c = C.new(3) 
p A.find(1) 
#=> #<A:0x10016c190> 
p B.find(2) 
#=> #<B:0x10016c140> 
p C.find(3) 
#=> #<C:0x10016c118> 
p A.find(2) 
#=> nil 
+0

好像我還是得把東西放在每一堂課。有沒有一種方法可以定義M中的所有內容 - 散列實例和查找函數(以及所有函數),然後我可以完成所有A實例,獲取所有A實例,並找到具有給定ID的B實例等。 – 2013-03-12 17:19:14

+0

在每個類中唯一要做的事情是在構造函數中調用'super'。不知道這對你是否是一個破壞者。查看最新的編輯順便說一句。 – 2013-03-12 17:21:49