如何强制子类实现包含特定值的集合属性
本文关键字:集合 属性 包含特 何强制 子类 实现 | 更新日期: 2023-09-27 18:07:12
我有一个具有抽象字典属性的抽象基类:
public abstract class BaseClass
{
//...
public abstract Dictionary<string, object> Settings { get; set; }
//...
}
我希望子类用一个名为"Text"的特定键来实现这个属性(如果需要,可以添加更多的键,但"Text"键必须存在),例如:
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"的键并带有关联值的最佳方法是什么?
正如其他人建议的那样,我将隐藏设置的实现(字典),并公开访问数据的方法:
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;
}
//...
}
我只想让Settings属性非抽象。
public abstract class BaseClass
{
//...
protected Dictionary<string, object> Settings { get; set; }
public BaseClass()
{
Settings = new Dictionary<string, object>()
{
{ "Text", "SomeText" }
};
}
//...
}
谢谢你的回答。如果不将字典封装在基类中并编写自定义get、set方法或编写另一个类来保存这些设置,似乎没有一种好方法来强制子属性包含特定的键。
事实证明,在我的情况下,我只需要对Settings属性进行只读访问,因此我最终使用公共只读字典包装器将基类上的受保护字典属性更改为公开内容。然后我通过构造函数参数对"Text"键强制设置。根本不需要抽象属性