我需要定义一个基类,它包含我的应用程序中日志记录的常见实现,并创建两个特定的类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移动应用上格式化代码。
答案 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