从抽象类方法访问具体类类型是一种好的做法吗

本文关键字:一种 类方法 抽象类 抽象 访问 类型 | 更新日期: 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并引发异常,或者将表名作为参数添加到保存方法中。