[英]Interface logic when a class has parent/child logic
我想把我的接口放到一個單獨的程序集中,但是我在實現接口時遇到了麻煩。
public interface IModelObject {...}
public interface IViewmodel
{
IModelObject ModelObject { get; }
}
public interface ITreeNodeViewmodel: IViewmodel {...}
public interface ITreeViewmodel
{
ITreeNodeViewmodel Root { get; set; }
}
現在在實施中:
public class NodeViewmodel:ITreeNodeViewmodel {...}
public class TreeViewmodel:ITreeViewmodel
{
NodeViewmodel Root { get; set; }
ITreeNodeViewmodel ITreeViewmodel.Root { get => Root; set => Root = (NodeViewmodel)value; }
ITreeNodeViewmodel ITreeViewmodel.Root => Root;
}
您可以看到該設計要求TreeViewmodel.Root
應約束為NodeViewmodel
類型。 我可以顯式地實現接口並在 setter 中有一個臭的顯式轉換。
有沒有更好的方法來對該屬性強制類型約束並仍然滿足接口?
鑒於您正在處理的要求,您的實現看起來不錯。 如果您不想要“臭味的演員表”,您可以嘗試以下方式:
set
{
if (value is NodeTreeItemViewmodel goodRoot)
{
Root = goodRoot;
}
else
{
throw new ArgumentException("Root must be a NodeTreeItemViewmodel
instance");
}
}
這需要更多的代碼,但如果出現問題,至少會給你更清晰的反饋。
您可以像這樣創建擴展其他接口的通用接口
public interface ITreeViewmodel<T> where T: ITreeNodeViewmodel
{
T Root { get; set; }
}
很有可能您最終會得到這種 object 結構:
public interface IModel
{ }
public interface IViewModel<M> : IModel
where M : IModel
{
M Model { get; }
}
public interface ITreeNodeViewModel<M> : IViewModel<M>
where M : IModel
{ }
public interface ITreeViewModel<M, T>
where M : IModel
where T : ITreeNodeViewModel<M>
{
T Root { get; }
}
public class TreeNodeViewModel<M> : ITreeNodeViewModel<M>
where M : IModel
{
public M Model { get; private set; }
}
public class TreeViewModel<M, T> : ITreeViewModel<M, T>
where M : IModel
where T : ITreeNodeViewModel<M>
{
public T Root { get; private set; }
}
我只是想我會發布它,因為我認為一旦您開始使用它,這將是您的 object model 的自然進展。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.