【问题标题】:How do I make a method in a vb generic interface that returns an instance of the implementing class?如何在返回实现类的实例的 vb 泛型接口中创建方法?
【发布时间】:2012-11-24 19:04:04
【问题描述】:

在 Visual Basic 中,我想创建一个接口,其中包含一个返回实现类对象的函数。那是

public interface I
  function maker as ???
end interface

public class X
  implements I
  function maker as X
    return new X()
  end function
end class

public class Y
  implements I
  function maker as Y
    return new Y()
  end function
end class

有没有办法这么说?我想我总是可以说maker 返回一个I 而不是XY,但是调用者必须强制转换它。我想把接口定义为

public interface I(of ii as I)

但这样做的重点是我可以创建一个使用 of I 的泛型类,如果我这么说,那么编译器会坚持无限回归 of I(of I(of I...

【问题讨论】:

    标签: vb.net generics interface


    【解决方案1】:

    不完全是,但你可以这样做:

    Public Interface I(Of T)
        Function Maker() As T
    End Interface
    
    Public Class X
        Implements I(Of X)
    
        Public Function Maker() As X Implements I.Maker
            Return New X()
        End Function
    End Class
    

    或者,像这样:

    Public Interface I
        Function Maker() As I
    End Interface
    
    Public Class X
        Implements I
    
        Public Function Maker() As I
            Return New X()
        End Function
    End Class
    

    这些选项都强制派生类返回它们自己类型的实例,但它们允许你以这种方式实现它。

    【讨论】:

    • 我还没有尝试过,但我会给你投票给正确答案,直到我尝试它并发现它不起作用!
    【解决方案2】:

    这就是你需要“奇怪地重复”类型声明的地方:

    Public Interface I(Of T As I(Of T))
        Function Maker() As T
    End Interface
    
    Public Class C
        Implements I(Of C)
    
        Function Maker() As C Implements I(Of C).Maker
            Return New C
        End Function
    End Class
    
    Sub Main
        Dim First As I(Of C) = New C
        Dim Second As C = First.Maker
    
    End Sub
    

    正如 Steven 所说,这仍然不会强制声明类型将自己用作 T,但至少现在 T 肯定实现了 I

    【讨论】:

    • 也许我错过了什么。我尝试这样做,当我尝试创建接口的实例时,VS 不会让我这样做,因为我陷入了“of”s 上的无限循环。
    • 我已经更新为一个完整的可编译示例(除了外部Module)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    相关资源
    最近更新 更多