【问题标题】:VB.Net interface to define function returning inherited collection of typeVB.Net 接口定义函数返回继承的类型集合
【发布时间】:2014-06-01 22:13:53
【问题描述】:

目前我们正在像这样使用对象和对象集合:

Public Class childObj Inherits BaseObjClass Implements IInspRevChild  
  ...  
End Class  

Public Class childObj_Collection Inhertis BaseObjCollClass(Of childObj)  
  ...  
End Class  

Public Class parentObj Inherits BaseObjClass Implements IInspRev  
  ...  
  Public Function GetChildren() AS childObj_Collection Implements IInspRev.GetChildrenCollection
    ...  
  End Function  
End Class  

我想定义一个带有 GetChildren 函数定义的接口。

我打算试试这样的:

Public Interface IInspRev  
  Function GetChildrenCollection() As BaseObjCollClass(Of BaseObjClass )  
End Interface  

但是编译器不喜欢这样。有人能帮我纠正一下吗?

【问题讨论】:

    标签: .net vb.net inheritance interface polymorphism


    【解决方案1】:

    您遇到了循环引用问题。 BaseObjClass 实现 IInspRev,而 IInspRev 又依赖于 BaseObjClass。编译器处于“先有鸡还是先有蛋”的境地并因此失败。

    IInspRev 方法中定义GetChildrenCollection 的更好方法可能是:

    Readonly Property Childrens() As ICollection(Of IInspRev)
    

    如果您不需要界面能够添加,删除或替换子项,这会更好:

    Readonly Property Childrens As IEnumerable(Of IInspRev)
    

    请注意,我将其设为只读属性而不是方法。这种公开子对象集合的方式在 .NET Universe 中是首选。

    【讨论】:

    • 我可以这样做:函数 GetChildrenCollection() As BaseObjCollClass(Of IInspRevChild)
    • @MKenyonII 不会因为BaseObjCollClass 依赖于BaseObjClass。请改用标准ICollectionIEnumerable
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-17
    • 1970-01-01
    • 2011-10-05
    • 2015-02-11
    • 1970-01-01
    相关资源
    最近更新 更多