17

假设我们有一个带有属性和 getter/setter 的类 InnerClass。我们还有一个包含 InnerClass 的类 OuterClass。

例如

class InnerClass
{
    private int m_a;
    private int m_b;

    public int M_A
    {
        get
        {
             return m_a;
        }
        set
        {
             m_a = value;
        }
     }
}

class OuterClass
{
    private InnerClass innerClass
}

我将如何为 OuterClass 的 innerClass 成员实现正确的 getter 和 setter?

提前致谢!

4

5 回答 5

27

语法不会有任何不同。只是...

public InnerClass InnerClass
{
    get { return innerClass; }
    set { innerClass = value; }
}

顺便说一句,如果您在 .NET 3.5 中使用 C#,那么您可以使用自动属性生成功能,前提是您所拥有的只是一个简单的属性,它只是读取和写入后备存储(就像上面那样)。语法类似于抽象属性的语法:

public InnerClass InnerClass { get; set; }

这会自动生成一个私有成员用于存储,然后在 中读取它get并在set.

于 2009-05-11T12:40:09.253 回答
22

最优雅的方法是使用隐式 getter 和 setter:

class InnerClass
{
  public int a{ get; set; }
  public int b{ get; set; }
}

class OuterClass
{
  public InnerClass innerClass{ get; set; }
}

这与以下内容隐含相同:

class InnerClass
{
    private int _a;
    public int a
    {
        get
        {
            return _a;
        }
        set
        {
            _a = value;
        }
    }

    private int _b;
    public int b
    {
        get
        {
            return _b;
        }
        set
        {
            _b = value;
        }
    }
}

class OuterClass
{
    private InnerClass _innerClass;
    public InnerClass innerClass
    {
        get
        {
            return _innerClass;
        }
        set
        {
            _innerClass = value;
        }
    }
}

这两个定义隐含地相同 - 减去相当多的击键。在第一个示例中,编译器将在幕后实现必要的私有字段,因此您不必这样做。但是,第二个可以让您更好地控制正在发生的事情。

于 2009-05-11T12:57:13.753 回答
2
public InnerClass InnerClass
    {
        get
        {
             return innerClass;
        }
        set
        {
             innerClass = value;
        }
     }
于 2009-05-11T12:40:47.193 回答
0

这取决于内部类应该如何工作。外部类可能需要“拥有”内部类,在这种情况下:

public InnerClass InnerClass{
  get{ return innerClass; }
  set{ innerClass.CopyFrom(value); /* Pseudo method call */ }
}

通过这样做,您可以防止外部代码操作实例,除非通过 OuterClass..

于 2009-05-11T12:45:32.593 回答
0

如果您的意思是访问内部类成员而不暴露内部类本身,则可以使用以下代码。如果您只想公开this.innerClass,则公开字段的方式没有区别InnerClass

class OuterClass
{
    private InnerClass innerClass

    public int M_A
    {
        get
        {
            if (this.innerClass != null)
            {
                 return this.innerClass.M_A;
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
        set
        {
            if (this.innerClass != null)
            {
                 this.innerClass.M_A = value;
            }
            else
            {
                throw new InvalidOperationException();
            }
        }
    }
}
于 2009-05-11T12:46:10.893 回答