2013-06-27 104 views
2

作爲一個小愛好項目,我試圖建立自己的對象系統。我想知道是否有辦法將所有類的默認繼承從Object更改爲我的基類Entity,以便每當創建新類時,我都不必明確說明class Thing < Entity;理想情況下,我只能說class Thing並且其默認超類是我的Entity類。你能改變Ruby中類的默認繼承嗎?

+0

我沒有看到這樣做的任何一點。無論你計劃在Entity上實現什麼特性,都可以在Object中實現,或者在'Object'中擴展'''''',然後你就完成了。 – sawa

回答

6

當然你可以通過修改relevant part of the Ruby source和重新編譯的Ruby這樣做:

VALUE 
rb_define_class_id(ID id, VALUE super) 
{ 
    VALUE klass; 

    if (!super) super = rb_cObject; // <-- where the default is set 
    klass = rb_class_new(super); 
    // ... 

但是,這是一個巨大的麻煩,需要修補和運行定製的紅寶石,可能有很多陷阱和東西的是硬編碼爲假設Object是默認值。

而且,最重要的是什麼?如果將Object替換爲其他默認超類,則每個類(包括Ruby核心中的那些類)都將繼承此新的默認超類。只需更改Object本身即可獲得相同效果(僅使用不同名稱),而無需自定義紅寶石。這是能夠重新開課的美麗!例如:

class Object 
    def foo 
    'bar!' 
    end 
end 

class A; end 

A.new.foo #=> 'bar!' 

如果你想成爲那種你甚至可能只是把一個Entity模塊而不是類所有相關方法,然後includeObject

+1

+1,不過你可能會展示如何monkeypatch Object,或者在其中包含一個模塊。 (你甚至可以在我輸入時添加這個編輯。) – Phrogz

+0

@Progrog好點,加':)'。 –

+0

+1,感謝您的輸入!我最近纔開始使用Ruby,儘管我已經開始熟悉它的語法,但我仍然不完全習慣實質上開源的編程語言。而且由於我沒有長時間使用它,我還沒有真正體驗到動態修改類的能力。我相信我可能會接受你最後的建議。 – DesAdams

0

不,不幸的是這在Ruby中不可行。 Ruby沒有像元對象協議那樣的例如CLOS,它允許你操作對象模型的核心語義。雖然這會很好!