【发布时间】:2018-09-05 01:45:34
【问题描述】:
我正在尝试更多地使用接口,并且经常发现自己将事件放入接口中。感觉很奇怪,因为我要让实现者知道何时在他们的实现中引发这些事件。
例如,我有一个 ILevellable 接口,它简单地说明一个对象应该有 xp、一个级别和一个最大级别,以及一些修改这些值的方法。引用 ILevellable 的类可能想知道它什么时候升级,所以我为 OnLevelUp 添加了一个动作......但实现可能没有把它放在正确的位置。
public interface ILevellable
{
int Level { get; }
int MaxLevel { get; }
int XP { get; }
event Action<bool> OnXPChanged;
event Action<ILevellable> OnLevelUp;
event Action OnMaxLevelReached;
void LevelUp(int newLevel);
}
我应该相信实现这个接口的用户会知道在哪里实现它吗?我会假设不会。尤其是因为某些事件可能有参数,同样,用户可能不知道它应该代表什么。
感谢任何指导!我是这样工作的新手。
谢谢!
【问题讨论】:
-
这可能会被标记为“基于意见”,这可能就是您需要的全部答案。我认为如果事件有 very good 评论描述,例如,
Action<bool>中的bool是什么,这没关系。或者,对于发布到野外的接口,我可能会使用EventHandler和EventArgs,它们强制对事件处理程序进行非常正式的定义。我认为它们对于内部代码来说过于冗长,但是.... -
请注意,在接口中实现属性和方法几乎同样容易,而对于试图实现该接口的人来说,这些属性和方法是完全难以理解的。 (比如我的
LevelUp的实现如果传入低于当前级别的级别该怎么办?) -
@zzxyz 是的,我在想拥有 EventArgs 或只是一些数据对象也可能是一个很好的解决方案......感谢您的“意见”:D 我现在就评论我的东西......
-
@SebastianKing - 请记住,接口仅描述接口 - 它们不描述行为。这不仅适用于事件,还适用于您公开的所有属性和方法。通常,只有当您将接口和一组单元测试配对时,您才会指定行为。
-
@zzxyz - 接口可能暗示了行为,但无法明确指定行为。您要么必须描述行为,要么提供单元测试——但这些都不是 C# 强制执行的。