如何填写嵌套类?

时间:2010-10-26 11:55:04

标签: c#

我有以下课程:

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

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

如何将数据(例如数字123)插入属性SomeNumber of InternalClass?

我是否需要通过ExternalClass的构造函数传递内容?我是否需要创建一个指向this.InternalClass的属性,并在ExternalClass的构造函数中实例化InternalClass?

是否也可以用对象初始化器以某种方式执行此操作?

5 个答案:

答案 0 :(得分:3)

请记住类型,而不是对象

我怀疑你试图做这样的事情并且它不起作用:

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

如果是这种情况,那么您设想InternalClass代表ExternalClass类型的某些复杂属性。但实际上它是自己的类型:ExternalClass.InternalClass。它嵌套在另一个类中的事实只是一个语言特性,它的存在是为了允许您设计其逻辑可以完全封装在现有类型范围内的类。

当你问这个时,你走在正确的轨道上:

  

我是否需要创建一个指向this.InternalClass的属性,并在ExternalClass的构造函数中实例化InternalClass?

这肯定有用。然后你就有了:

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
};

您需要做的是将set属性设为InternalInstance公开(不可取):

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

或者,更好的是,向ExternalClass添加指向其SomeNumber属性的InternalInstance属性的属性:

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

然后你可以这样做:

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

由你决定。

答案 1 :(得分: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;

(在这种情况下有点毫无意义,但希望你能得到这个想法)。

答案 2 :(得分:0)

外部类需要保存对内部类的引用(如果这是您要完成的内容。

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

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

如果要在创建InternalClass的对象时初始化ExternalClass,则根据我所知,您必须提供构造函数。对象初始值设定项只允许初始化对象属性。不属性。

使用构造函数,类可以如下所示:

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对象的列表。

答案 3 :(得分: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}
    }
}

答案 4 :(得分:0)

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

    public InternalClass
    {
      get
      {
           return m_NestedClass;
      }
    }
}