Vb.net MustInherit将自己的类型作为参数

Vb.net MustInherit将自己的类型作为参数,vb.net,Vb.net,我在一个三层项目中有两个库——称它们为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 Boole

我在一个三层项目中有两个库——称它们为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
有没有办法处理接口中不同类型的参数?某种通用的?这是可能的吗?

这是一个完美的使用案例

使用通用接口:

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

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

实施:

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

这看起来像是一个实现细节,在这种情况下,您保存的对象应该实现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

非常好用,非常感谢您的快速回答和示例。我知道泛型,但我不知道
classbaseclass(of t)
语法。我考虑过这一点,但我的BO(实际上是业务对象)库不应该访问数据库。。。我的项目中的主要问题是DAL引用BO,而不是BO引用DAL-在这种情况下,问题不会出现。我本来打算改变的,但后来。。。无论如何,谢谢你的回答:)