【问题标题】:Implement an interface in partial class在部分类中实现接口
【发布时间】:2015-01-05 08:23:19
【问题描述】:

我需要我所有的TableAdapters 来实现自定义接口。问题是接口定义的一些成员驻留在 DataSet 的设计器文件中,我不想(也不应该)更改该文件,因为该代码将自动重新生成。出于同样的原因,我也无法将这些成员重新定位到我的代码文件中。我的出路是什么?

【问题讨论】:

  • 它是一个强类型数据集。每个 DataTable 都有自己的 TableAdapter,不幸的是它继承自 Component 而不是 DbTableAdapter 或更具体的东西,所以我试图通过在所有这些适配器中实现我自己的接口来填补空白。
  • 您可以创建一个自定义类来实现接口并扩展 DataSet 或 Component 或其他任何东西,然后使用它来代替预定义的 UI 组件。这样,您将同时拥有自定义行为和 TableAdapter。
  • @pasty:您使用过强类型数据集吗?这将有助于理解我在说什么。我有多个 DataTable,每个都有自己的 TableAdapter。它们都已经具有那些共同的属性和方法(具有完全相同的签名)。只是这些TableAdapter类没有继承自一个好的基类,也没有实现一个通用的接口,所以我不得不分别为每个TableAdapter编写相同的代码。有了它们都实现的自定义接口,我可以使用多态性一次性处理所有这些适配器。
  • 是的,我使用过强类型数据集。我确实相信,TableAdapter 类可以是extended through a partial class,或者可以创建 TableAdapter 和/或 DataSet 的基类(稍后将使用它来代替预定义的组件)。
  • 只需创建每个适配器的部分类并实现接口。

标签: vb.net class interface partial-classes


【解决方案1】:

当您实现一个接口时,您声明的成员不必与接口的成员同名,也不必是公共的。假设您有这个设计器生成的类:

Partial Public Class SomeClass

    Public Sub FirstMethod()
        Console.WriteLine("FirstMethod")
    End Sub

    Public Sub SecondMethod()
        Console.WriteLine("SecondMethod")
    End Sub

End Class

并且你希望它实现这个接口:

Public Interface ISomeInterface

    Sub FirstMethod()

    Sub ThirdMethod()

End Interface

请注意,接口有一个名为FirstMethod 的方法,但SomeClass 已经有一个名为FirstMethod 的方法。您可以添加自己的部分类来实现这样的接口:

Partial Public Class SomeClass
    Implements ISomeInterface

    Private Sub FirstMethodInternal() Implements ISomeInterface.FirstMethod
        Me.FirstMethod()
    End Sub

    Public Sub ThirdMethod() Implements ISomeInterface.ThirdMethod
        Console.WriteLine("ThirdMethod")
    End Sub

End Class

实现ISomeInterface.FirstMethod 的方法未命名为FirstMethod,因此它不会与具有该名称的现有方法发生冲突,它也是Private,因此无法使用@987654330 类型的引用从外部访问它@。不过,使用 ISomeInterface 类型的引用是另一回事。如果你使用这样的代码:

Dim sc As ISomeInterface = New SomeClass

sc.FirstMethod()
sc.ThirdMethod()

您会发现您的SomeClass 对象的FirstMethodInternal 方法被调用,然后又调用同一对象的FirstMethod 方法。尝试运行该代码并在 FirstMethodFirstMethodInternal 方法上放置断点以向自己证明这一点。

【讨论】:

  • 这太棒了。从来没有意识到这些可能是私人的。非常感谢。
猜你喜欢
  • 2017-06-22
  • 2011-02-06
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2018-05-12
  • 1970-01-01
相关资源
最近更新 更多