【发布时间】:2019-06-17 10:58:12
【问题描述】:
我有一些界面:
interface IServerListener
{
void onServerStarted();
void onSessionStarted();
void onSessionCompleted(List<string> data);
}
还有一些方法,它获取该接口的一个实例来执行方法:
public void start(IServerListener listener)
{
IPEndPoint hostPoint = new IPEndPoint(IPAddress.Parse(getLocalHost()), PORT);
serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
serverSocket.Bind(hostPoint);
serverSocket.Listen(5);
listener.onServerStarted(); //Calling
while(true)...
}
当我从主表单类执行此方法 (start) 时,我想将实现此接口的匿名类准确地传递给参数以访问使用表单元素:
private void Form1_Load(object sender, EventArgs e)
{
server = new Server();
server.start(new IServerListener()
{
void onServerStarted()
{
rtxtOutput.AppendText("Started... ");
}
void onSessionCompleted(List<string> data)
{
rtxtOutput.AppendText("Session completed: " + String.Join(", ", data));
}
void onSessionStarted()
{
rtxtOutput.AppendText("New session started... ");
}
});
}
但我不能像在 Java 中那样做。我收到以下消息:
Cannot create an instance of the abstract class or interface 'IServerListener'
所以我尝试创建单独的类来实现这个接口并且已经在那里做我需要的事情。但我无法从那里获得使用表单元素的权限:
private class AnonymousIServerListener : IServerListener
{
public void onServerStarted()
{
rtxtOutput.AppendText("Started... ");
//The name 'rtxtOutput' does not exist in the current context
}
public void onSessionCompleted(List<string> data)
{
rtxtOutput.AppendText("Session completed: " + String.Join(", ", data));
//The name 'rtxtOutput' does not exist in the current context
}
public void onSessionStarted()
{
rtxtOutput.AppendText("New session started... ");
//The name 'rtxtOutput' does not exist in the current context
}
}
请告诉我在这种情况下没有拐杖该怎么办。 C# 一般可以使用匿名类吗?如果没有,这种情况该怎么办?
提前致谢。问候...
【问题讨论】:
-
是的,您可以创建匿名类型。不,您不能以您尝试的方式使用它们。匿名类型仅在您使用它们的代码块内有效。如果您想将它们作为参数传递,那么它们不能是匿名的。
-
@SᴇM 你没有。你可以做的是OP所说的:创建该接口的匿名实现。但无论如何。 .Net 的工作方式不同。
-
你为什么要这样做?
-
@Fildor 所以如果你写
new IServerListener() {rest here}它将创建一个实现IServerListener的匿名类?不知道,抱歉耽误您的时间,祝您有愉快的一天) -
@SᴇM 不客气。这是合法的并且看起来像它实际上并没有让我发疯一次,因为一所大学广泛使用了它,而我刚刚从 .net 2.0 切换到 Java。
标签: c# interface anonymous-class