Vb.net 从抽象类重写变量
我需要定义一个基类,该基类包含应用程序中日志记录的常见实现,并创建两个特定的类LogA和LogB,它们将使用基类中的方法,并使用一个特定的变量确定要使用的日志记录程序 现在我有以下代码:Vb.net 从抽象类重写变量,vb.net,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) E
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移动应用程序上格式化代码。不知道您的全部规格以及您试图实现的目标;我想知道单身模式是否完成了你需要完成的事情 您必须执行
LogB.GetInstance().WriteDebug(“Oh noes!”)
而不是LogB.WriteDebug(“Oh noes!”)
。这并没有那么好,但是当您谈论基类访问子类的成员集时,这可能是唯一的方法。这假设您可以在应用程序的同一实例中使用不同的日志
如果您只想在运行时/启动期间注入不同的记录器(即,如果您正在生产、开发或单元测试中运行),那么您可能希望了解依赖注入(例如Ninject)或其他形式的IOC(控制反转)
显然,这是一个比最初看起来更复杂的问题!但是,可能是因为我们从错误的角度看待它。您不能覆盖字段或基类的共享成员。只能重写您声明为可重写的方法或属性。您可以声明一个方法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实现,这是他们创建派生类实例的唯一方法。您可以拥有在派生类中实现的实例属性,并返回共享日志变量:
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
您有ILog和WriteDebug方法作为共享,但您希望使用继承来定义记录器。你能告诉我们如何使用这个吗?例如,使用LogA.WriteDebug(“消息”)将写入记录器“aaaa”。BaseLog.WritedBug(“msg”)应该做什么?BaseLog是一个抽象类,它不应该单独做任何事情。因此将有一组记录器(LogA、LogB等),这些类的用户将使用他们想要的特定记录器。参考资料将被硬编码。