2012-07-17 40 views
1

我在三层项目中有两个库 - 称它们为BO和DAL。几乎在每一个DAL类实现了保存方法:MustInherit以自己的类型作为参数

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

至于我来补充缺少的保存方法,我虽然是创造它实现了一个为“MustInherit保存”功能的接口是一个好主意。所以,如果我输入:

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

完美的使用案例generics

使用通用接口:

接口:

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 
+0

完美地工作,非常感谢您的快速回答和例子。我意识到泛型,但我不知道'Class BaseClass(Of T)'语法。 – gobes 2012-07-17 12:56:59

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对象,您不必担心它是什么类型的对象,您只需致电保存:

Public Class DALItem 
    Inherits DAL 

    Public Overrides Function Save(someObject As ISaveable) As Boolean 
    Return someObject.Save() 
    End Function 
End Class 
+0

我想过,但是我的BO(实际上是Business Object)库不应该访问数据库......我的项目中的主要问题是DAL引用BO而不是BO引用DAL--在这种情况下,问题不会出现。我计划改变这一点,但后来...无论如何,感谢您的答案:) – gobes 2012-07-17 13:33:44