我在层次结构中有一个对象,其值可以默认为父对象的值。两个对象属于同一类型。
例如:如果Score
属性是double.NaN
,那么Score
应该从Parent
属性指向的对象中检索值,但前提Parent
是设置了 ( Parent != null
)。
我的问题是,我怎样才能以一种通用的方式可靠地实现这样的模型?我有 2 个选择,但也许还有更多?
选项 1:更改每个属性 getter 和 setter 以检查正在设置或获取的属性是否具有默认值,如果是,请尝试从父级读取它
private double score = double.NaN;
public double Score
{
get { return (score == double.NaN && Parent != null) ? Parent.Score : score; }
set { score = (Parent != null && Parent.Score == value) ? double.NaN : value; }
}
优点:
- 分别对所有属性值进行实时原子更新
- 默认值的显式比较
缺点:
- 每个属性的getter和setter都需要手动实现,容易出错
- 每次获取和设置都会影响性能
选项 2:实现对象加载和保存的默认设置
void AfterLoad()
{
if(Parent != null)
{
if(score == double.NaN)
{
score = Parent.Score;
}
// (...)
}
}
void BeforeSave()
{
if(Parent != null)
{
if(score == Parent.Score)
{
score = double.NaN;
}
// (...)
}
}
void AfterSave()
{
AfterLoad();
}
优点:
- 仅在加载(一次)和保存(两次)时使用父关系,从而提高性能
缺点:
任何时候父对象的改变都不会影响子属性
在更改父对象之前和之后,需要对子对象进行处理(在父对象更改后回退到新的默认值)
原子性可能会受到影响 - 在保存对象期间不能被任何其他线程访问
我相信很多人在实现对象“样式化”模型时都遇到过类似的困境。我正在寻找一个干净且有效的解决方案,它也可以将子对象和父对象的集合连接在一起(使用 CompositeCollection ?)。