覆盖抽象类的变量

时间:2014-07-10 19:02:59

标签: vb.net

我需要定义一个基类,它包含我的应用程序中日志记录的常见实现,并创建两个特定的类LogA和LogB,它们将使用基类中的方法和确定要使用的记录器的特定变量。

现在我有以下代码:

Public MustInherit Class BaseLog

  Private Shared _Log As ILog 'This must be overridden in specific classes

  Shared Sub WriteDebug (value As String)

  End Sub

End Class

Public Class LogA
  Inherits BaseLog

  Private Shared _Log As ILog = LogManager.GetLogger ("aaaa")

End Class

我该怎么做?

PS:我不知道如何在stackexchange移动应用上格式化代码。

3 个答案:

答案 0 :(得分:1)

您无法覆盖基类的字段或共享成员。只能覆盖您声明为Overridable的方法或属性。您可以声明一个方法MustInherit来强制派生类提供实现,您可以考虑使用GetLogger()函数。

在这种情况下,您是否绝对想要确保客户端代码为您提供有效的记录器,更明显的解决方案是向您的基类添加构造函数:

Public MustInherit Class BaseLog
    Public Sub New(logger As ILog)
        If logger is Nothing Then 
            Throw New ArgumentNullException("You must provide a logger")
        End If
        _Log = logger
    End Sub
    '' etc..
End Class

现在,客户端代码被迫为您提供有效的ILog实现,这是他们创建派生类实例的唯一方法。

答案 1 :(得分:0)

不了解您的整个规范以及您想要实现的目标;我想知道单身模式是否完成了你需要完成的任务。

而不是LogB.WriteDebug("Oh noes!"),您必须LogB.GetInstance().WriteDebug("Oh noes!")。它不太好,但是当你谈论基类访问子类的成员集时,它可能是唯一的方法。这假设您可以在应用程序的同一实例中使用不同的日志。

如果您只想在运行时/启动期间注入不同的记录器(即,如果您正在生产,开发或单元测试中运行),那么您可能需要查看依赖注入(例如Ninject),或者一些其他形式的IOC(控制反转)。

显然,这是一个比最初看起来更复杂的问题!但是,我们可能会从错误的角度看待它。

答案 2 :(得分:0)

您可以拥有一个在派生类中实现的实例属性,并返回共享日志变量:

Public MustInherit Class BaseLog

    Public MustOverride ReadOnly Property _Log As ILog

    Shared Sub WriteDebug(value As String)
    End Sub
End Class

Public Class LogA
    Inherits BaseLog

    Private Shared log As ILog = LogManager.GetLogger("aaaa")

    Public Overrides ReadOnly Property _Log As ILog
        Get
            Return log
        End Get
    End Property
End Class