我有一個基類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