D.R*_*.R. 2 c# interface access-modifiers
C#故意阻止我在接口成员上放置内部访问修饰符.我很确定他们必须付出额外的努力才能实现这一限制,因为他们可以同样允许它.
应该有充分的理由去投入这些努力 - 哪一个?
对我来说,在接口上使用内部访问修饰符来实现"从外部防止可变性"将是有用的.例如,考虑以下界面:
interface IMessage
{
...
DateTime LastSentTimestamp { get; internal set; }
...
}
Run Code Online (Sandbox Code Playgroud)
在我的消息代理内部,我希望能够设置LastSentTimestamp.我的API的外部用户不应该更改它.当然,我可以抛弃接口并使用类,但是,这会删除所有接口的优点(例如,随时更改实现等)
Q1:我不明白为什么他们限制我.有什么特别的原因吗?
Q2:我正在寻找针对上述特定情况的解决方法.拆分界面分为两个(IMessage和IInternalMessage)看起来像是一个巨大的痛苦屁股,希望不是我唯一的选择...
我猜C#设计者看到的冲突是你不能internal在声明程序集(和朋友程序集)之外的成员实现一个接口.当然,如果外部程序集只使用接口,那么执行此操作仍然很有用.另一方面,您可以使用第二个internal--only接口获得此行为:
public interface IPublic { /* all public members */ }
internal interface IPrivate : IPublic { /* additional members */ }
Run Code Online (Sandbox Code Playgroud)
你自己的类实现IPrivate.外部代码只能使用IPublic.