【问题标题】:Setting properties inside class that is definied inside antoher class在另一个类中定义的类中设置属性
【发布时间】:2013-09-04 00:00:38
【问题描述】:

我有这段代码:

class MyClass
{

    public class MySubClass
            {
                public int One {  private set; public get; }
                public int Two { private set; public get; }
                public int Three { private set; public get; }
            };
    public MySubClass ObjectMySubClass { private set; public get; }

    private void SetSomething()
    {
        ObjectMySubClass.One = 5; //can do that
    }

}

我怎样才能使我的一、二和三变量可以在课堂外读取但只在 MyClass 中设置?

MyClass obj = new MyClass();
obj.ObjectMySubClass.One = 5; //can't
int value = obj.ObjectMySubClass.One; //can do that

【问题讨论】:

  • 你有一个嵌套类,而不是子类?
  • 防止这种可访问性的方法是:不要将其设为嵌套类型。另一种方法是:选择性地不要这样做(即,如果您认为不应该访问该值,请不要访问该值)。
  • 我刚刚将您的代码复制到一个项目中,它会为我抛出一个编译器错误

标签: c# class oop properties


【解决方案1】:

不幸的是,我认为您不能仅使用访问修饰符来做到这一点。您可以添加额外的接口只读属性并将MySubClass 隐藏为私有:

class MyClass
{
    public interface IMySubClass
    {
        int One { get; }
        int Two { get; }
        int Three { get; }
    }

    private class MySubClass : IMySubClass
    {
        public int One { set; get; }
        public int Two { set; get; }
        public int Three { set; get; }
    };

    private MySubClass _objectMySubClass;
    public IMySubClass ObjectMySubClass
    {
        get { return _objectMySubClass; }
    }

    private void SetSomething()
    {
        _objectMySubClass.One = 5; //can do that
    }
}

【讨论】:

    【解决方案2】:

    一种方法是使用构造函数:

    class MyClass
    {
    
    public class MySubClass
    {
        public int One { private set; get; }
        public int Two { private set; get; }
        public int Three { private set; get; }
    
        public MySubClass(int one, int two, int three)
        {
            this.One = one;
            this.Two = two;
            this.Three = three;
        }
    
    };
    
    public MySubClass ObjectMySubClass { private set; get; }
    
    private void SetSomething()
    {
        this.ObjectMySubClass = new MySubClass(1, 2, 3);
    }
    }
    

    然后:

            MyClass obj = new MyClass();
            //obj.ObjectMySubClass.One = 5; //can't
            //obj.ObjectMySubClass = new MyClass.MySubClass(1, 2, 3); //can't
            int value = obj.ObjectMySubClass.One; //can do that
    

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-05
      • 2018-08-13
      相关资源
      最近更新 更多