2016-03-03 36 views
0

我看到這樣的事情this library,從他們的父母繼承的嵌套類

class A 
    # ... 
    class B < A 
    # ... 
    end 
end 

這是不奇怪?我得到了可以在其他類中聲明類的概念,但是這些嵌套類繼承自父類。這是不是像一個無限循環?

也許它看起來比較簡單,但這張圖片讓我猶豫不決。我在這裏錯過了一些隱藏的好處,還是我不知道的特殊Ruby成語?

回答

2

命名空間和子類是兩個不同的東西。他們沒有任何關係。

這樣做:

class A 
    class B 
    end 
end 

你在A命名空間定義B,因此A::B(但B不是A一個子類,實際上它是Object子類)。

這樣做:

class A 
end 

class B < A 
end 

定義BA一個子類(但B是不是在A命名空間;事實上,它是主要的環境::(或Object::)的命名空間。

在您的例子:

class A 
    class B < A 
    end 
end 

兩個HAPP同時存在,但它們彼此獨立,並且沒有矛盾。

2

除了@ sawa的回答:這可以作爲重構過程中的中間步驟。

說,我遇到了一些大胖類,我清楚地看到幾個子類可以在這裏提取。但我還不知道他們的名字。而當我這樣做時,我可能會在這個過程中多次重命名它們。這使得爲​​每個子類創建一個文件成爲不必要的障礙。所以我開始在那裏聲明子類,並在同一個文件中移動代碼。當我有點滿意時,然後我會將子類移到他們的專用文件。或者,也許我不會,如果他們非常小(我覺得他們不值得一個單獨的文件)。