从抽象类方法访问具体类类型是一种好习惯吗?

时间:2015-11-20 16:46:37

标签: c# asp.net vb.net

情境: 我有一个抽象类方法,根据具体类构造设置的属性值调用不同的数据库存储过程。特定的具体类需要向存储过程发送额外的参数。

问题: 如果具体类是特定类型,从抽象类方法访问具体类类型并将额外参数发送到数据库存储过程是一种好习惯吗? 以下是代码段:请提示我是否做错了。

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#

,概念都是一样的

3 个答案:

答案 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方法。