2016-09-15 6 views
1

특정 값이 포함 된 컬렉션 속성 구현하는 자식 클래스를 적용하는 방법 :내가 추상 사전 속성을 추상 기본 클래스를

public abstract class BaseClass 
{ 
    //... 
    public abstract Dictionary<string, object> Settings { get; set; } 
    //... 
} 

내가 자식 클래스라는 특정 키에이 속성을 구현하고자을 " , 텍스트 "(필요한 경우 복수의 키를 추가 할 수 있지만"텍스트 "키가 있어야합니다) 예 :

public class ChildClass : BaseClass 
{ 
    //... 
    private Dictionary<string, object> _settings = new Dictionary<string, object>() 
    { 
     { "Text", "SomeText" } 
    }; 
    public Dictionary<string, object> Settings 
    { 
     get{ return _settings; } 
     set{ _settings = value; } 
    } 
    //... 
} 

뿐만 아니라 속성을 구현하지만이 포함되어 있는지 확인하기 위해 자식 클래스를 시행 할 수있는 가장 좋은 방법은 무엇입니까 관련 지을 수 있었던 「Text」라고 불리는 키

+1

유일한 방법은 기본 클래스에서 사전 작업을 캡슐화하는 것입니다. 사전을 사용하는 대신 설정 클래스를 만드는 것은 실제로 저에게 소리 지르고 있습니다. 단순히 사전을 노출하면 키 추가/제거를 제어 할 수 없습니다. – itsme86

+0

'Dictionary'를 노출시키지 마십시오 (기본 클래스에 비공개로 설정). 'IReadonlyDictionary' 및 사전 조작 (추가, 삭제, 기타와 결합 등) 메소드를 제공합니다. 이렇게하면 콘텐츠를 완전히 제어 할 수 있습니다. – Sinatr

답변

2

. 사전을 기본 클래스에 캡슐화하지 않고 사용자 정의 get을 작성하거나 메소드를 설정하거나 설정을 보유 할 다른 클래스를 작성하지 않고 특정 키를 포함하도록 하위 등록 정보를 강제 적용하는 좋은 방법이없는 것처럼 보입니다.

필자의 상황에서는 Settings 속성에 읽기 전용으로 액세스해야하므로 공용 읽기 전용 사전 래퍼를 사용하여 기본 클래스의 보호 된 사전 속성으로 내용이 노출되도록 변경되었습니다. 그런 다음 생성자 인수를 통해 "텍스트"키의 설정을 적용합니다. 결국 추상 속성이 필요하지 않습니다.

+0

구조가 조금 바뀌어 결국 적용되지 않았지만 원래 질문에 대한 최선의 대답으로 받아 들였습니다. –

0

설정 속성을 비 추상적으로 설정하면됩니다. 답변에 대한

public abstract class BaseClass 
{ 
    //... 
    private readonly Dictionary<string, object> _settings = new Dictionary<string, object>(); 

    protected BaseClass() { } 

    public object GetSetting(string name) 
    { 
     if ("Text".Equals(name)) 
     { 
      return this.GetTextValue(); 
     } 
     return this._settings[name]; 
    } 

    // this forces every derived class to have a "Text" value 
    // the value could be hard coded in derived classes of held as a variable 
    protected abstract GetTextValue(); 

    protected void AddSetting(string name, object value) 
    { 
     this._settings[name] = value; 
    } 


    //... 
} 
0

감사 : 다른 사람이 내가 설정 (사전)의 구현을 숨기고, 데이터에 액세스하는 방법을 노출 할 제안으로

public abstract class BaseClass 
{ 
    //... 
    protected Dictionary<string, object> Settings { get; set; } 
    public BaseClass() 
    { 
     Settings = new Dictionary<string, object>() 
     { 
      { "Text", "SomeText" } 
     }; 
    } 
    //... 
} 
관련 문제