Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 从抽象类重写变量_Vb.net - Fatal编程技术网

Vb.net 从抽象类重写变量

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

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

不知道您的全部规格以及您试图实现的目标;我想知道单身模式是否完成了你需要完成的事情

您必须执行
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等),这些类的用户将使用他们想要的特定记录器。参考资料将被硬编码。