从抽象类方法访问具体类类型是一种好的做法吗
本文关键字:一种 类方法 抽象类 抽象 访问 类型 | 更新日期: 2023-09-27 18:23:43
场景:我有一个抽象类方法,可以根据具体类构造设置的属性值调用不同的数据库存储过程。一个特定的具体类需要向存储过程发送一个额外的参数。
问题:如果具体类是特定类型,那么从抽象类方法访问具体类类型并向数据库存储过程发送额外的参数是否是一种好的做法?下面是代码片段:如果我做错了,请提出建议。
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#,概念都是相同的
更好的方法是在基类中定义一个受保护的、抽象的、只获取的属性,该属性返回一个bool,指示该类是否需要额外的参数。或者,如果只在极少数情况下为true,则可以在基类中提供一个返回false的默认实现。重写MemberCustomField
中的getter以返回true。
我想你已经知道这是一种糟糕的做法了
也许问题是,应该怎么做呢?
如果你想添加额外的参数,可以使用一个返回这些参数的虚拟/抽象方法:
Public Overridable Function ExtraParameters() as List(Of SqlParameters)
// your derived classes can return the extra parameters, if any
Return New List(Of SqlParameter)
End
如果从基类继承而忘记设置名称,该怎么办?
您可能希望检查是否已设置_TableName
并引发异常,或者将表名作为参数添加到保存方法中。