2016-09-15 1 views
1

ich eine abstrakte Basisklasse mit einer abstrakten Wörterbuch Eigenschaft habe:Wie Kind-Klassen durchzusetzen, um eine Sammlung Eigenschaft zu implementieren einen bestimmten Wert enthält

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

Ich mag Kind Klassen diese Eigenschaft mit einem bestimmten Schlüssel implementieren "genannt Text“(mehr Tasten kann bei Bedarf hinzugefügt werden, aber der‚Text‘Schlüssel muss vorhanden sein), zB:

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; } 
    } 
    //... 
} 

Was ist die beste Art und Weise Kind-Klassen durchzusetzen, um nicht nur die Eigenschaft zu implementieren, sondern um sicherzustellen, dass es enthält ein Schlüssel namens "Text" mit einem zugehörigen Wert?

+1

Der einzige Weg wäre, den Betrieb des Wörterbuchs in der Basisklasse zu kapseln. Es schreit tatsächlich nach mir, eine Settings-Klasse zu erstellen, anstatt ein Dictionary zu verwenden. Wenn Sie das Wörterbuch einfach verfügbar machen, können Sie das Hinzufügen/Entfernen von Schlüsseln nicht steuern. – itsme86

+0

Setzen Sie 'Dictionary' nicht frei (machen Sie es zur Basisklasse privat), aber z. 'IReadonlyDictionary' und bieten eine Methode zum Bearbeiten von Wörterbuch (hinzufügen, löschen, kombinieren mit anderen, etc.). Auf diese Weise haben Sie volle Kontrolle über den Inhalt. – Sinatr

Antwort

2

Wie andere haben vorgeschlagen, ich würde die Umsetzung der Einstellungen (das Wörterbuch) verbergen und Methoden setzen die Daten zuzugreifen:

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

Ich habe meine Struktur ein wenig reorganisiert, so dass dies nicht zutrifft, aber ich akzeptierte es als die beste Antwort auf die ursprüngliche Frage –

0

Ich würde nur die Einstellungen Eigenschaft nicht abstrakt machen.

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

Danke für die Antworten. Es sieht so aus, als gäbe es keine gute Möglichkeit, die untergeordnete Eigenschaft so zu erzwingen, dass sie einen bestimmten Schlüssel enthält, ohne das Wörterbuch in die Basisklasse zu kapseln und benutzerdefinierte get zu schreiben, Methoden festzulegen oder eine andere Klasse zu schreiben.

Wie es sich herausstellt, in meiner Situation brauche ich nur Lesezugriff auf die Einstellungen -Eigenschaft, so dass ich zu einer geschützten Wörterbucheigenschaft in der Basisklasse mit einem öffentlichen schreibgeschützten Wörterbuch Wrapper geändert, um den Inhalt verfügbar zu machen. Dann erzwinge ich die Einstellung über den Schlüssel "Text" über Konstruktorargumente. Keine abstrakten Eigenschaften werden benötigt.

Verwandte Themen