2

我在一个 3 层项目中有两个库 - 称它们为 BO 和 DAL。几乎 DAL 中的每个类都实现了 Save 方法:

Public Function Save(ByVal someObject As BO.SomeType) As Boolean

由于我必须添加缺少的 Save 方法,但我认为创建一个实现“MustInherit Save”功能的接口是个好主意。所以如果我输入:

MustOverride Function Save(ByVal someObject As BO.SomeType) As Boolean

这应该够了吧; 但是参数的类型总是不同的。例如,在 DAL.TypeA 类中:

Public Function Save(ByVal someObject As BO.SomeTypeA) As Boolean

在 DAL.TypeB 类中:

Public Function Save(ByVal someObject As BO.SomeTypeB) As Boolean

有没有办法在接口中处理不同类型的参数?某种通用的?这甚至可能吗?

4

2 回答 2

5

泛型的完美用例。

使用通用接口:

界面:

Interface ISave(Of T)

    Function Save(someObject As T) As Boolean

End Interface

执行:

Class BoClass
    Implements ISave(Of BoClass)

    Public Function Save(someObject As BoClass) As Boolean Implements ISave(Of BoClass).Save
    End Function

End Class

Class DalClass
    Implements ISave(Of DalClass)

    Public Function Save(someObject As DalClass) As Boolean Implements ISave(Of DalClass).Save
    End Function

End Class

或者,使用通用基类而不是接口

基类

MustInherit Class BaseClass(Of T)

    MustOverride Function Save(someObject As T) As Boolean

End Class

执行

Class BoClass
    Inherits BaseClass(Of BoClass)

    Public Overrides Function Save(someObject As BoClass) As Boolean
    End Function

End Class

Class DalClass
    Inherits BaseClass(Of DalClass)

    Public Overrides Function Save(someObject As DalClass) As Boolean
    End Function

End Class
于 2012-07-17T12:46:40.697 回答
1

这看起来像是一个实现细节,在这种情况下,您保存的对象应该实现您的 DAL 类将调用的接口。

Public Interface ISaveable
  Function Save() As Boolean
End Interface

然后执行实际保存的对象实现它:

Public Class BOItem
  Implements ISaveable

  Public Function Save() As Boolean Implements ISaveable.Save
    'do the actual saving here
  End Function
End Class

然后,您的基类将只要求接口:

Public MustInherit Class DAL
  MustOverride Function Save(someObject As ISaveable) As Boolean
End Class

然后当您创建 DAL 对象时,您不必担心它是什么类型的对象,您只需调用 save:

Public Class DALItem
  Inherits DAL

  Public Overrides Function Save(someObject As ISaveable) As Boolean
    Return someObject.Save()
  End Function
End Class
于 2012-07-17T13:13:07.767 回答