创建接口的匿名实例
Create anonymous instance of interface
我是 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
}
});
您不能在 .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)
我是 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
}
});
您不能在 .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)