2010-03-10 114 views
5

對於在.NET中涉及嵌套類型的某些場景,我很好奇什麼是好的做法。公開的嵌套類型

假設你有一個Wheel類,並且Wheel類包含Bearing對象。軸承對象只在輪子內有意義,並且不希望獨立創建它,所以將軸承類嵌套在輪子對象內是有意義的。但是,可以說你有一個場景,你現在需要閱讀Wheel類以外的Wheel.Bearings屬性。這現在需要公開嵌套的軸承類。

在這種情況下,最好的選擇是什麼?
1 - 創建嵌套在輪類
2內的公共軸承類 - 創建獨立的軸承類,這需要輪對象在其構造
3 - 創建輪命名空間和創建該命名空間裏的獨立軸承類。
4 - 其他?

更新: 我正在更新此更多的細節,並反映了迄今爲止的一些建議。 ClassParent是父類,ClassChild是子類。 ClassChild始終是ClassParent的孩子,它獨立存在是沒有意義的。問題是ClassChild有幾個屬性需要公開顯示,而其餘的只能從ClassParent調用。一個示例是一個ClassChild.Delete函數,它不應該公開顯示,因爲它只能從ClassParent調用,因爲ClassParent需要執行適當的清理和修改。

在回顧了這些建議後,我提出的設計看起來有點不潔,所以我想我會要求輸入。我有:

public class Parent 
{ 
    ChildNested childObj 

    public DeleteChild() 
    { 
     //expose this method publically 
     childObj.DeleteChild() 
     //other functionality 
    } 

    public Child GetChild() 
    { 
     //expose Child, not ChildNested publically 
     return childObj 
    } 

    private class ChildNested:Child 
    { 
     public Child() 
     { 
       Base.Child() 
     } 
     public DeleteChild() 
     { 
       Base.Delete() 
     } 
    } 

public abstract class Child 
{ 
protected Child() 
    { 
    } 
protected Delete() 
    { 
    } 
    public PublicPropertyToExpose() 
    { 
    }  
} 

回答

8

這裏最好的設計是創建一個公共Bearing類與internal構造函數和類Wheel中創建它的實例。

如果Bearing類需要訪問Wheel類的私有成員,可以使公衆Bearingabstract,然後再做出具體implentation作爲Wheelprivate嵌套類。

一般來說,you should not make public nested types

+0

+1。我完全同意。嵌套類型很難閱讀,很難遵循。當你對他們編程時,你總是需要指定輸出類型,這很煩人。 – Steven 2010-03-10 17:16:10

+0

但是如果情況是,軸承永遠也不應該存在沒有輪子存在?因爲在這種情況下,您實際上可以創建一個沒有車輪的軸承對象。一個例子是一個Keyboard類和一個Key類,如果沒有鍵盤,你永遠不會擁有一個keybody鍵。 – 2010-03-10 17:24:16

+0

有什麼辦法可以創建一個具有兩個(或更多)公共類的派生類,但不是「公開」派生的,除非公開基類,具有私有構造函數,然後派生類嵌套在它內?在設計階級層次結構時,我經常會發現自己陷入了一個角落,我想成爲公共類的東西被卡在其他類中。除了提供比我真正想要的更大的範圍之外,還有什麼好方法呢? – supercat 2010-12-06 19:53:40

1
  • 創建私有構造
  • 獨立的軸承類創建一個工廠類,將實例化軸承類給出一個車輪類
+0

或者在輪子上有一個返回軸承的方法,比如說「CreateBearing」。 – 2010-03-10 17:13:05

1

我想考「軸承」獨立,所以我會去第二個選項。

1

軸承可以單獨存在,因爲它可能足以用於世界其他地方,在車輪之外。

車輪通過使用軸承進行聚合,但車輪沒有定義方位。軸承是有用的,可以用在除了車輪之外的其他物件上。

事實上,您需要一個軸承的公共財產表明它必須是Wheel以外的公共類。

另外,當你重新發明輪子(我們都做......)會發生什麼。也許你會使用一種新的「空氣軸承」,例如微型渦輪機中的「空氣軸承」,現在在Wheel類中有多種軸承類型,其中一些類型未被使用。

我把軸承放在同一個命名空間內,但不在Wheel類內。我很少發現需要內部課程。通常一個匿名課程填補我需要的任何空白。