C#故意阻止我在接口成员上放置内部访问修饰符。我很确定他们在实现这一限制时还需要付出额外的努力才能实现这一限制。
应该有充分的理由花费这些努力 - 哪一个?
对我而言,在接口上使用内部访问修饰符来实现“从外部防止可变性”将是有用的。例如。考虑以下界面:
interface IMessage
{
...
DateTime LastSentTimestamp { get; internal set; }
...
}
在我的消息代理内部,我希望能够设置LastSentTimestamp
。我的API的外部用户应该不能够更改它。当然,我可以抛弃接口并使用类,但是,这会删除所有接口的优点(例如,随时更改实现等)。
Q1:我不明白为什么他们限制我。有什么特别的原因吗?
Q2:我正在寻找针对上述特定情况的解决方法。将界面拆分为两个(IMessage
和IInternalMessage
)看起来像是一个巨大的痛苦,希望不是我唯一的选择...
答案 0 :(得分:5)
我认为C#设计人员所看到的冲突是你无法在声明程序集(和朋友程序集)之外实现与internal
成员的接口。当然,如果外部程序集只使用接口,那么执行此操作仍然很有用。另一方面,您可以使用第二个internal
- 仅接口来获取此行为:
public interface IPublic { /* all public members */ }
internal interface IPrivate : IPublic { /* additional members */ }
您自己的类实现IPrivate
。外部代码只能使用IPublic
。
答案 1 :(得分:1)
不是你的接口成员应该有访问修饰符,而是整个界面,以便具有一致的可访问性和你的类。接口仅在由类实现时使用。接口表示必须由实施者实现的合同。如果一个类存在于接口的程序集之外,它将如何实现你的内部成员?因此,它无法实现合同,但其中的类必须能够......在逻辑上不一致。