簡體   English   中英

class 具有父/子邏輯時的接口邏輯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM