1

私はこのコードを持っています:

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
    }

}

One、Two、および Three 変数をクラス外で読み取ることができるが、MyClass だけで設定できるようにするにはどうすればよいですか?

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

2 に答える 2

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
    }
}
于 2013-08-31T09:59:31.037 に答える
0

1 つの方法は、コンストラクターを使用することです。

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
于 2013-08-31T10:05:24.280 に答える