Авто-свойства с изменяемыми объектами

Я пытаюсь сделать свойства для изменяемых объектов. Это проблема с авто-свойствами? Например, следующий код будет разрешать нежелательные манипуляции с изменяемым объектом. Как бы мне этого избежать?

public class Mutable{
    public int Value { get; set; }
}

public class ClassWithMutable{
    public Mutable Object { get; }

    public ClassWithMutable(){
        this.mutable = new Mutable();
        this.mutable.Value = 0;
    }
}

public class Demo{
    public static void Main(String[] args){
        ClassWithMutable test = new ClassWithMutable();
        Mutable o = test.Object;
        o.Value = 1;
    }
}

2 ответа

Решение

Вы можете использовать интерфейс, который только выставляет get свойств и частного класса, который его реализует.

public interface IImmutable {
    int Value { get; }
}

public class ClassWithImmutable{

    private Mutable _object;        
    public IImmutable Object { get { return _object; } }

    public ClassWithImmutable(){
        this._object = new Mutable();
        this._object.Value = 0;
    }

    private class Mutable : IImmutable {
        public int Value { get; set; }
    }

}

public class Demo{
    public static void Main(String[] args){
        ClassWithImmutable test = new ClassWithImmutable();
        IImmutable o = test.Object;
        o.Value = 1;    // fails
    }
}

Я пытаюсь понять цель вашего вопроса, а не ваш вопрос, и я подхожу немного ниже. Тем не менее, я думаю, что я придумал что-то.

Вы можете "замаскировать" свой изменяемый объект под интерфейсом только для чтения.

public class ClassWithMutable
{
    public IImumutable Mutable { get { return _mutable; } }
    private Mutable _mutable;
    public ClassWithMutable()
    {
        _mutable = new Mutable()
        {
            Value = 1
        };
    }
}
public interface IImumutable
{
    int Value { get; }
}
public class Mutable : IImumutable
{
    public int Value { get; set; }
}

Пока ваш ClassWithMutable Экземпляр разоблачает Mutable экземпляр как Immutable тогда потребитель не может легко изменить это. (Я подчеркиваю легко, потому что всегда есть способ, которым вы можете изменить его. Это зависит от того, насколько усердно вы хотите работать.)

Другие вопросы по тегам