我有一个基类BaseObject
,我想在整个应用程序中使用。 BaseObject
确实只定义了应用程序中所有对象必须具有的公共Guid
;此外,BaseObject
定义了许多帮助生成财产变更事件的方法。这导致了下面的代码:
[DataContract]
public abstract class BaseObject
{
private Guid id;
[DataMember]
public Guid Id
{
get { return id; }
set { ChangeProperty(ref id, value, "Id"); }
}
protected virtual void ChangeProperty<T>(
ref T property,
T value,
string propertyName)
{
// Change the property and generate events
}
}
问题
因为所有对象必须从BaseObject
继承,这意味着派生类将有一个“固定” ChangeProperty
。我想修改ChangeProperty
,以便它输出到控制台,我将不得不修改基类。
潜在的解决方案
,我已经重新编写,现在看起来像下面的代码;我有一个单独的类来处理属性更改:
public interface IPropertyChangeHelper
{
void ChangeProperty<T>(
ref T property,
T value,
string propertyName,
PropertyChangingEventHandler changingHandler,
PropertyChangedEventHandler changedHandler);
}
[DataContract]
public abstract class BaseObject
{
// passed in during construction
private readonly IPropertyChangeHelper propertyChangeHelper;
private Guid id;
[DataMember]
public Guid Id
{
get { return id; }
set { ChangeProperty(ref id, value, "Id"); }
}
// Forwarding method
protected virtual void ChangeProperty<T>(
ref T property,
T value,
string propertyName)
{
// Forward to helper
}
}
可能有人请提供一些反馈,我是否继续沿着正确的方向关于可组合/继承?
如果你在这里有一个“虚拟”成员,为什么你必须改变基类?它看起来像你的基类本身实际上只是一个接口本身。我不确定这个问题是不是以意见为基础适合SO – Carsten 2014-09-03 07:34:12
嗨,感谢您的评论。是否有另一个董事会/论坛可以让我更加自信地回应? – user2684289 2014-09-03 08:00:37
http://codereview.stackexchange.com/? – 2014-09-03 08:46:55