2016-08-29 10 views
0

변경 가능한 개체의 속성을 만들려고합니다. 자동 속성에 문제가 있습니까? 예를 들어, 다음 코드는 변경 가능한 객체를 원하지 않는 조작을 허용합니다. 어떻게 이것을 피할 수 있습니까?변경 가능한 개체가있는 자동 속성

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

그렇다면 'o.Value = 1;'이 작동하는 것을 원하지 않으십니까? – Quantic

+3

개체를 변경할 수 없게 만드시겠습니까? setter를 정의하면 변경 가능성이 있습니다. –

+0

내 Mutable 개체를 ClassWithMutable 클래스 내에서만 변경할 수 있습니다. – nostro

답변

3

속성의 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 
    } 
} 
1

귀하의 질문보다는 질문의 의도를 이해하려고 노력 중입니다. 조금만 설명 드리겠습니다. 그러나 나는 뭔가를 생각해 냈다.

읽기 전용 인터페이스에서 변경 가능한 개체를 "마스크"할 수 있습니다.

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 인스턴스가 Immutable 후 소비자 수는 없습니다 쉽게 변화 그것으로 Mutable 인스턴스를 노출한다. (나는 당신이 그것을 바꿀 수있는 방법이 거의 없기 때문에 쉽게 강조하고있다. 단지 당신이 얼마나 열심히 일하기를 원하는지에 달려있다.)