2

私はObjective-Cのバックグラウンドを持っており、デリゲートを含むVB.NETを作成しています。Workerいくつかのタスクを実行するクラスがあります。このクラスのプロパティの1つはILoggerオブジェクトであり、ログファイルに追加するためのメソッドがあります。(Workerオブジェクトをロギングから切り離して、GUIで処理するようにしたいです。)Objective-Cでは、次のように宣言できます。

@property (nonatomic, strong) id<LoggingDelegate> logger;

次に、次のような行をコードに振りかけます

[logger appendToLog:@"Beginning polarity reversal..."];

Objective-Cでは、loggerこれが機能するために実際にオブジェクトに設定する必要はありません。null参照(Objective-Cでは「nil」)の場合、appendToLog:メッセージはランタイムによって黙って無視されます。

VB.NETでは、次のようなことができます。

Public Property logger As ILogger

logger.AppendText("Beginning polarity reversal...")

ただし、もちろん、loggerこれを機能させるには、実際にはオブジェクトに設定する必要があります。ワーカーにロガーオブジェクトがアタッチされていない場合を処理する慣用的な方法は何ですか?(より一般的には、VB.NETでのデリゲートパターンの実装は慣用的ですか?)

4

2 に答える 2

4

オプションのオブジェクトを使用するたびに、最初に null かどうかを確認できます。たとえば、次のようになります。

If logger IsNot Nothing Then
    logger.AppendText("Beginning polarity reversal...")
End If

または、追加のチェックを行うプライベート メソッドを作成することもできます。

Private Sub AppendTextToLog(text As String)
    If logger IsNot Nothing Then
        logger.AppendText("Beginning polarity reversal...")
    End If
End Sub

または、vcsjones が推奨するように、プロパティをデフォルトでダミー オブジェクトにすることもできます。

Public Class MyClass
    Private Class DummyLogger
        Implements ILogger

        Public Sub AppendText(text As String) Implements ILogger.AppendText
            ' Do nothing
        End Sub
    End Class

    Public Property Logger As ILogger
        Get
            Return _logger
        End Get
        Set(ByVal value As ILogger)
            _logger = value
        End Set
    End Property
    Private _logger As ILogger = New DummyLogger()

    Public Sub DoWork()
        _logger.AppendText("Beginning polarity reversal...")
    End Sub
End Class

または、VB.NET の「オプションのデリゲート」に最も近いものは、実際には次のEventとおりです。

Public Class MyClass
    Public Event AppendText(text As String)

    Public Sub DoWork()
        RaiseEvent AppendText("Beginning polarity reversal...")
    End Sub
End Class

アップデート

VB 14.0 (Visual Studio 2015) の時点で、演算子を使用できるようになりました?.(「null 条件付き」演算子と呼ばれます)。

logger?.AppendText("Beginning polarity reversal...")

または、実際のデリゲートを使用する場合は、同じ演算子をデリゲートでも使用できます。したがって、 というデリゲート変数がある場合appendToLog、次のように呼び出すことができます。

appendToLog?.Invoke("Beginning polarity reversal...")
于 2013-01-25T17:32:35.977 に答える
2

null オブジェクトで拡張メソッドを呼び出すことができることを指摘するために、私の道徳的信念をしばらく保留します。したがって、次のように書くと:

Module M
    <Extension>
    Public Sub LogIfNotNull(logger As ILogger, message As String)
        If logger IsNot Nothing Then
            logger.AppendText(message)
        End If
   End Sub
End Module

この拡張メソッドを使用して ILogger に書き込むことができ、必要なことが行われます。さて、あなたの住所をこのコードの近くに配置することはお勧めしません。なぜなら、それを見つけた次の開発者はおそらくあなたの住んでいる場所を知りたがるからです。十分に言った。

vcsjones のポイントは最高です (誰が実際にそれを回答として書いて、それを受け入れることができるようにする必要があります!): NullLogger オブジェクトを作成し、それを使用します。次に、「ログを記録したくない」という抽象化が呼び出し元から隠されます。

于 2013-01-25T17:39:17.000 に答える