情境: 我有一个抽象类方法,根据具体类构造设置的属性值调用不同的数据库存储过程。特定的具体类需要向存储过程发送额外的参数。
问题: 如果具体类是特定类型,从抽象类方法访问具体类类型并将额外参数发送到数据库存储过程是一种好习惯吗? 以下是代码段:请提示我是否做错了。
Public MustInherit Class dbBaseCustomField
Protected _TableName as string
Public Sub Save(conn as string, customField as CustomField)
lSqlCommand.CommandType = CommandType.StoredProcedure
lSqlCommand.CommandTimeout = ApplicationGlobals.cCommandTimeout
lSqlCommand.Parameters.Add("@ParentItemId", SqlDbType.Int).Value = piParentItemId
lSqlCommand.Parameters.Add("@CFChk" , SqlDbType.Int).Value = customField.Value
If (Me.GetType() Is GetType(MemberCustomField)) Then
lSqlCommand.Parameters.Add("@AddSyncTrigger ", SqlDbType.Int).Value = customField.AddSyncTrigger
End If
lSqlConnection.Open()
lSqlCommand.ExecuteNonQuery()
lSqlConnection.Close()
End Sub
End Class
Public Class MemberCustomField
Inherits dbBaseCustomField
Sub New()
_TableName = "MemberCustomField"
End Sub
End Class
Public Class LocationCustomField
Inherits dbBaseCustomField
Sub New()
_TableName = "LocationCustomField"
End Sub
End Class
注意:我使用VB代码并标记了C#,因为有更多的c#开发人员,问题会影响很多人。无论是vb.net还是c#
,概念都是一样的答案 0 :(得分:1)
更好的方法是在基类中定义一个受保护的抽象的get-only属性,该属性返回一个bool,指示该类是否需要额外的参数。或者,如果只在极少数情况下才会出现这种情况,则可以在基类中提供返回false的默认实现。覆盖MemberCustomField
中的getter以返回true。
答案 1 :(得分:1)
如果要添加额外参数,请使用返回这些参数的虚拟/抽象方法:
Public Overridable Function ExtraParameters() as List(Of SqlParameters)
// your derived classes can return the extra parameters, if any
Return New List(Of SqlParameter)
End
答案 2 :(得分:0)
如果从基类继承并忘记设置名称,您打算做什么?
您可能要检查_TableName
是否已设置并抛出异常或将表名作为参数添加到save方法。