【问题标题】:Create anonymous instance of interface创建接口的匿名实例
【发布时间】:2016-08-22 19:58:07
【问题描述】:

我是 vb.net 的新手,我有一个函数,它接受一个类型化的接口,我想创建一个接口的匿名实例作为方法参数。

界面

Public Interface MessageHandler(Of T)

    Sub Handle(Message As T)

End Interface

我不确定我是否正确描述了我的问题,所以这就是我在 Java 中想要的:

界面

public interface MessageHandler<T> {

    public abstract void handle(T message);

}

方法调用

function(new MessageHandler<Type>() {

    public void handle(Type message) {
        //Do Something
    }

});

【问题讨论】:

  • 如果你懂 java 为什么不使用 C# 而不是 VB.NET?

标签: vb.net interface anonymous-class


【解决方案1】:

您不能在 .NET 中创建接口的匿名实现。你必须有一个具体的实现,但你可以很容易地隐藏它并提供相同类型的匿名化。

我已经对您的命名约定进行了 .NET 化,但这里是:

Public Interface IMessageHandler(Of T)
    Sub Handle(message As T)
End Interface

Public NotInheritable Class MessageHandler
    Private Sub New()
    End Sub
    Private Class AnonymousMessageHandler(Of T)
        Implements IMessageHandler(Of T)
        Private _handler As Action(Of T)
        Public Sub New(handler As Action(Of T))
            _handler = handler
        End Sub
        Public Sub Handle(message As T) Implements IMessageHandler(Of T).Handle
            Dim h = _handler
            If h IsNot Nothing Then
                h(message)
            End If
        End Sub
    End Class

    Public Shared Function Create(Of T)(handler As Action(Of T)) As IMessageHandler(Of T)
        Return New AnonymousMessageHandler(Of T)(handler)
    End Function
End Class

或者,在 C# 中:

public interface IMessageHandler<T>
{
    void Handle(T message);
}

public static class MessageHandler
{
    private class AnonymousMessageHandler<T> : IMessageHandler<T>
    {
        private Action<T> _handler;
        public AnonymousMessageHandler(Action<T> handler)
        {
            _handler = handler;
        }
        public void Handle(T message)
        {
            _handler?.Invoke(message);
        }
    }

    public static IMessageHandler<T> Create<T>(Action<T> handler)
    {
        return new AnonymousMessageHandler<T>(handler);
    }
}

你可以这样称呼它(在 VB.NET 中):

MessageHandler.Create(Of Integer)(Sub (x) Console.WriteLine(x)).Handle(42)

【讨论】:

    猜你喜欢
    • 2016-10-06
    • 1970-01-01
    • 2021-04-27
    • 2016-02-06
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多