2010-10-26 60 views
0

我有以下類:如何填滿嵌套類?

public class ExternalClass 
{ 
    public string Name {get;set;} 

    public class InternalClass 
    { 
     public int SomeNumber {get;set} 
    } 
} 

如何插入數據,例如數字123,進入InternalClass的財產SomeNumber?

我是否需要通過ExternalClass的構造函數來傳遞事物?我是否需要創建一個指向this.InternalClass的屬性並讓它在ExternalClass的構造函數中實例化,即InternalClass?

也可以用對象初始值設定項以某種方式做到這一點?

+0

「填滿」是什麼意思? – bluevoodoo1 2010-10-26 11:58:22

+0

我調整了我原來的問題。 – 2010-10-26 12:01:30

回答

3

記住一個是一個類型,而不是一個對象

我懷疑你試圖做這樣的事情,並沒有奏效:

var x = new ExternalClass(); 
x.InternalClass.SomeNumber = 5; 

如果是這種情況,那麼你預想InternalClass爲代表ExternalClass類型的某些複雜屬性。但實際上它是自己的類型:ExternalClass.InternalClass。嵌套在另一個類中的事實僅僅是一種語言功能,其目的在於允許您設計其邏輯可完全封裝在現有類型範圍內的類。

所以你在正確的軌道上,當你問這個:

我需要創建一個指出了this.InternalClass媒體資源,並且它實例化,InternalClass,在構造函數ExternalClass?

這肯定會奏效。然後,你必須:

public class ExternalClass 
{ 
    // Here you are definining a type. 
    public class InternalClass 
    { 
     public int SomeNumber {get;set} 
    } 

    // And here are some properties providing access to 
    // actual objects... 
    public string Name { get; set; } 

    // ...including an instance of the type you defined 
    // above. 
    public InternalClass InternalInstance { get; private set; } 

    public ExternalClass() 
    { 
     InternalInstance = new InternalClass(); 
    } 
} 

用法:

var x = new ExternalClass(); 
x.Name = "Nyla"; 
x.InternalInstance.SomeNumber = 5; 

此外,在回答這個問題:

是否也可以用 對象初始化以某種方式來做到這一點?

絕對。然而,這是不行的:

var x = new ExternalClass 
{ 
    Name = "Nyla", 
    InternalInstance.SomeNumber = 5 // illegal 
}; 

你必須做的是要麼讓setInternalInstance財產公開(不可取):

var x = new ExternalClass 
{ 
    Name = "Nyla", 
    InternalInstance = new ExternalClass.InternalClass 
    { 
     SomeNumber = 5; 
    } 
}; 

或者,更好,添加一個屬性ExternalClass指向其InternalInstance財產SomeNumber屬性:

// added to ExternalClass 
public int InternalNumber 
{ 
    get { return InternalInstance.SomeNumber; } 
    set { InternalInstance.SomeNumber = value; } 
} 

那麼你可以做THI s:

var x = new ExternalClass 
{ 
    Name = "Nyla", 
    InternalNumber = 5 
}; 

由你決定。

0

外部類需要保存到內部類的引用(如果這是你的AR etrying完成的任務。

public class ExternalClass 
{ 
    public string Name {get;set;} 
    public InternalClass IClass{get;set;} 

    public class InternalClass 
    { 
     public int SomeNumber {get;set} 
    } 
} 

如果你想在你創建ExternalClass的對象初始化InternalClass,你。將不得不爲據我所知提供一個構造函數初始化對象只讓你初始化一個對象的屬性不是財產的性質

隨着構造函數的類可以是這樣的:

public class ExternalClass 
{ 
    public string Name {get;set;} 
    public InternalClass IClass{get;set;} 

    public ExternalClass(int number){ 
     IClass = new InternalClass(){ SomeNumber = number}; 
    } 
    public class InternalClass 
    { 
     public int SomeNumber {get;set} 
    } 
} 

然後,你可以初始化整個對象是這樣的:

ExternalClass eclass = new ExternalClass(somenumber){Name = name}; 

我寧願一個構造函數既somenumbername,但這是偏好的問題。

ExternalClass如果需要,還可以包含一個列表InteralClass對象。

0

當需要類時,可以使用單例模式來實例化類。

public class ExternalClass 
{ 
    public string Name {get;set;} 
    private InternalClass m_NestedClass = null; 
    public InternalClass 
    { 
     get 
     { 
      if (m_NestedClass == null) m_NestedClass = new InternalClass(); 
      return m_NestedClass; 
     } 
    } 

    public class InternalClass 
    { 
     public int SomeNumber {get;set} 
    } 
} 
+0

單身是不是用來確保只有一個實例可能?當我想創建更多的ExternalClass實例並將它們放入列表中時,這不會發生衝突嗎? – 2010-10-26 12:12:59

0
public class ExternalClass 
{ 
    private InternalClass m_NestedClass = new InternalClass(); 

    public InternalClass 
    { 
     get 
     { 
      return m_NestedClass; 
     } 
    } 
} 
+0

我認爲你的代碼可能有點誤入歧途 – 2010-10-26 12:13:41

+0

@Grant:這只是@ Dennis代碼的更正確版本 – abatishchev 2010-10-26 12:31:13

1

這取決於你想要做什麼。你可以直接訪問它,例如:

ExternalClass.InternalClass dodgy = new ExternalClass.InternalClass(); 
dodgy.SomeNumber = 6; 

然而,這將打破law of demeter,一般是一個壞主意。 InternalClass是公開的並且暴露於世界的原因嗎?你可能想嘗試使InternalClass私人和委託給它,像這樣:

public class ExternalClass 
{ 
    private InternalClass numberHolder; 

    public ExternalClass() { 
     numberHolder = new InternalClass(); 
    } 

    public int MyNumber { 
     get { 
      return numberHolder.SomeNumber; 
     } 

     set { 
      numberHolder.SomeNumber = value; 
     } 
    } 

    private class InternalClass 
    { 
     public int SomeNumber { get; set; } 
    } 
} 

然後,你可以這樣做:

ExternalClass numberHolder = new ExternalClass(); 
numberHolder.MyNumber = 3; 

(毫無意義的種類在這種情況下,但希望你的想法)。

+0

謝謝你指出demeter的定律。有更多這樣的法律/這樣的事情嗎? – 2010-10-26 12:34:16

+1

哦,是的,還有更多..你不應該試圖直接應用它們,但是demeter法(LOD)是一個很好的遵循(這裏的一些答案將打破)。同時查看SOLID原則(http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod)。 – 2010-10-26 12:40:07