是否有可能阻止在实现接口的类中实现公共非接口方法?
例如
public interface ICanDoSomething
{
void CanDoA();
void CanDoB();
}
public class Doer : ICanDoSomething
{
public void CanDoA()
{
//Do A
}
public void CanDoB()
{
//Do B
}
public void CanDoC()
{
//Don't do this!!! it's not defined in the interface!!!
}
}
Run Code Online (Sandbox Code Playgroud)
只是为了澄清,我想在编译时阻止它,而不是在运行时.
如果C#能够做你想要实现的目标,那么语言本身就会破坏面向对象的编程特性之一:封装.
让实现者以自己的方式实现您的接口,并专注于接口实现的质量,而不是将您的工作放在不实现比接口定义的方法更多的方法上(即实现实现者应该通过的单元/集成测试来验证黑盒子实际上按预期工作).
当您使用接口时,您会得到黑盒子:您不关心实现如何完成工作,但是您关心它是否能够正确完成工作.
摘自您在自己的问题中添加的一些评论:
没有具体的用例,只是想将那些使用库的人指向面向组件的功能并避免上帝对象.
你想避免上帝的对象,但你想要上帝的方法.每个人都会喜欢一个具有良好的关注点和分段的类,而不是每个都有1k代码行的3个方法.
如何打破单一责任原则?如果一个实现接口的类突然开始做一些很容易成为其他类的责任的东西,那么它也不会破坏OOP吗?
不,单一责任原则与面向对象编程的定义(即继承,多态和封装)无关,而是与代码质量有关.
使用接口或使用任何自己的编程语言构造都无法确保代码质量.这是代码审查的使命.
当然,自动化测试可确保代码以高质量运行,而质量则与编码质量不同.