C#实现带有事件的接口

3

我有一个如下所示的接口:

public delegate void ScriptFinished();

public interface IScript
{
    event ScriptFinished ScriptFinishedEvent;
}

现在我想要实现以下所示的接口:
public class Script : IScript
{
    event ScriptFinished ScriptFinishedEvent;
}

但我遇到了错误:
' Script.ScriptFinishedEvent '无法实现接口成员,因为它不是公共的。
好的,我将public添加到事件中:
public interface IScript
{
    public event ScriptFinished ScriptFinishedEvent;
}

但是错误是:

修饰符'public'对于此项无效

我在这里做错了什么,如何实现带有事件的接口?


14
在实现中加入public,而不是在接口中加入。 - Sinatr
2
请注意,接口中的所有内容都是公共的,因此您无法对它们应用任何访问修饰符,即使是 public。 - juharr
1
附注:我建议您使用EventHandler而不是自定义委托。如果需要,您也可以使用自定义的EventArgs(EventHandler<ScriptFinishedEventArgs>)。 - Fildor
@juharr,接口中的所有内容现在都是公共的...但C# 8很可能通过允许修饰符来改变这一点 - David Arno
1
@David 哎呀...这就是我很高兴能够从Java切换回C#的唯一原因... :D - Fildor
显示剩余3条评论
2个回答

16

改变:

public class Script : IScript
{
    event ScriptFinished ScriptFinishedEvent;
}

致:

public class Script : IScript
{
    public event ScriptFinished ScriptFinishedEvent;
}

'Script.ScriptFinishedEvent'无法实现接口成员,因为它不是公共的。

这是指类而非接口。


哈哈,现在我明白了。将实现的事件声明为公共的就可以了。谢谢! - folibis

0

接口实现必须是public的:

public class Script : IScript
{
    public event ScriptFinished ScriptFinishedEvent;
}

然而,如果你想限制特定类的访问权限,你可以隐藏它。这是最接近于将其设为私有的方法:

public class Script : IScript
{
    event IScript.ScriptFinished ScriptFinishedEvent;
}

在这种情况下,您仍然可以访问ScriptFinishedEvent,但是您首先必须将其转换为IScript。(例如,C#中的Array.Add()实现了IList接口)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接