2013-04-29 75 views
0

我知道這可能是一個長鏡頭,但我認爲我會問:繼承時的Ruby執行代碼類部分初始化

因爲Ruby沒有執行父類的initialize方法,除非你明確地調用super在繼承類的initialize方法(或者除非你不在繼承類中重載它),我想知道在實例化一個繼承類的新實例時是否還有其他一些方法來執行代碼作爲父上下文的一部分(也許是一個鉤子) ...

當執行B的初始化方法時,這是目前的行爲:

class A 
    def initialize 
     puts "Inside A's constructor" 
    end 
end 

class B < A 
    def initialize 
     puts "Inside B's constructor" 
    end 
end 

A.new 
B.new 

# Output 
# => Inside A's constructor 
# => Inside B's constructor 

我在想,如果輸出可以以某種方式:

A.new 
# => Inside A's constructor 
B.new 
# => Inside A's constructor 
# => Inside B's constructor 
+1

這是不特定於'initialize'。所有方法都很常見。如果一個方法總是隱式地調用super方法,那麼你將不能覆蓋子類的方法定義。這將是非常不方便的。 – sawa 2013-04-29 20:08:52

+0

您正在要求'A'中的代碼強制在'B'中發生某些事情,在這種語言構造中,不幸的是,這些語言結構對您不利。儘管取決於上下文,但你可能有選擇。我認爲這是爲了一個目的,例如簡化框架中的子分類?許多框架提供了替代方法來生成實例的屬性,例如子類中的構造函數不是必需的,並且基類構造函數可以在框架用戶「確保您調用超級」的情況下運行而不會有任何尷尬的指示。 – 2013-04-29 21:33:19

+0

我想執行某些繼承規則。例如:我不希望類直接從其他類繼承。我想強制這個邏輯實例化一個新的對象。 – 2013-04-30 05:49:33

回答

0
class A 
    def initialize 
     puts "Inside A's constructor" 
    end 
end 

class B < A 
    def initialize 
     super 
     puts "Inside B's constructor" 
    end 
end 

A.new 
B.new 

輸出:

Inside A's constructor 
Inside A's constructor 
Inside B's constructor 
0

當然可以,只需調用super在子類初始化方法

class A 
    def initialize 
    puts "Inside A's constructor" 
    end 
end 

class B < A 
    def initialize 
    super 
    puts "Inside B's constructor" 
    end 
end 

A.new 
B.new 

輸出:

Inside A's constructor 
Inside A's constructor 
Inside B's constructor 
+0

如果你看看我原來的問題,我很清楚,你可以使用'super'從繼承類調用構造函數,但是這樣會失去目的... – 2013-04-30 05:37:59

+1

@MikeyS。我非常好奇你*之後的目標*。這個問題並不完全清楚。 'super'完全是你想要的...... – 2013-04-30 05:48:12