【问题标题】:Using interfaces as method parameters in C# or vb.net在 C# 或 vb.net 中使用接口作为方法参数
【发布时间】:2012-02-24 00:57:53
【问题描述】:

如何将派生类初始化的对象传递给以Interface为参数的方法?下面是我正在尝试的示例。可能吗?请提出任何更好的方法。

Public Interface IFruit
    Property Name As String
    Property Color As String
End Interface



Public Class Fruit
    Implements IFruit
    Private _Name As String
    Private _Color As String

    Public Property Color As String Implements IFruit.Color
        Get
            Return _Color
        End Get
        Set(value As String)
            _Color = value
        End Set
    End Property

    Public Property Name As String Implements IFruit.Name
        Get
            Return _Name
        End Get
        Set(value As String)
            _Name = value
        End Set
    End Property
End Class


Public Class FruitExtended
    Inherits Fruit

    Private _Taste As String
    Public Property Taste() As String
        Get
            Return _Taste
        End Get
        Set(ByVal value As String)
            _Taste = value
        End Set
    End Property
End Class

Public Class A

Public Sub ProcessFruit(F as IFruit)
'...
'Do something
End Sub

下面的代码可以工作吗?或者如何以其他方式实现这一目标?

Public Sub Test()
   Dim F1 as new FruitExtended()
   ProcessFruit(F1)
End sub

End Class

【问题讨论】:

  • 你试过了吗?自己只需要几秒钟就能得到答案。
  • 我建议这样做:Dim F1 As IFruit = New FruitExtended()
  • 谢谢,知道了。假设如果我有一个从两个接口(比如 A,B)实现的类,如何定义一个以接口为参数的泛型方法?我的意思是该方法中的参数类型应该是什么(应该是 A 还是 B)?
  • 如果一个方法只需要使用其中一个接口,参数一般应为该类型。如果许多方法都需要两者,并且您控制实现接口的类的代码,请定义一个继承前两个但不添加任何新成员的新接口,并让您的类实现它。然后使用该新接口作为参数类型。如果一个方法需要的对象恰好实现了两个接口,但不共享任何公共类或接口,则有一些方法可以处理它,但它们更复杂。

标签: vb.net interface


【解决方案1】:

我没有尝试您的代码,但是 - 一般来说 - 接口很好,因为它们定义了 行为 而不是状态(属性)。所以也许你可以重新考虑你的设计,问问自己 ProcessFruit 应该用 IFruit 做什么。

有些语言甚至不允许在接口中声明属性,而不是常量。 Java 就是一个例子。

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2012-09-15
    • 2012-07-03
    • 2014-07-02
    • 2021-02-20
    • 2011-02-04
    相关资源
    最近更新 更多