是否可以阻止在实现接口的类中实现公共非接口方法?
E.g。
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!!!
}
}
为了澄清,我想在编译时阻止它,而不是在运行时。
答案 0 :(得分:5)
如果C#能够做你想要达到的目标,语言本身就会破坏面向对象的编程功能之一:封装。
让实施者以自己的方式实现接口,并专注于接口实现的质量,而不是将精力放在上,而不是实现比接口定义的方法更多的方法(即实现一个单元/集成测试,实施者应通过该测试来证明黑盒实际上按预期工作)。
当您使用界面时,您会得到黑盒子:您不关心实现如何完成工作,但是如果它能够正确地完成工作,您就会关心。
取自你在自己的问题中添加的一些评论:
没有具体的用例,只想指导那些使用库的人 面向组件的功能并避免上帝对象。
你想避免上帝对象,但你想要上帝方法。每个人都会喜欢一个具有良好的关注点和分割的类,而不是每个都有1k代码行的3种方法。
打破单一责任原则怎么样?如果是一个班级 实现一个接口突然开始做很容易的事情 是其他班级的责任,是不是也打破了OOP?
不,单一责任原则与面向对象编程的定义(即继承,多态和封装)无关,但它与代码质量<相关/强>
无法通过接口或使用任何自己的编程语言构造来确保代码质量。这是code review的使命。
当然,自动化测试可确保代码以质量运行,这与以质量编码不同。
答案 1 :(得分:3)
从技术上讲,您无法阻止CanDoC()
声明,但您可以通过工厂方法和内部实施来无用 :
// interface is public when its implementation is internal
internal class Doer : ICanDoSomething {
// To prevent creating Doer as Doer
protected internal Doer() { // or internal
//Some staff if required
}
public void CanDoA() {... }
public void CanDoB() {... }
// Technically possible
public void CanDoC() {... }
}
public static class DoerFactory {
// ... create instead Doer as ICanDoSomething instance
// (factory method)
public static ICanDoSomething Create() {
return new Doer();
}
}
...
ICanDoSomething test = DoerFactory.Create();
test.CanDoA(); // OK
test.CanDoC(); // Compile time error
(test as Doer).CanDoC(); // Compile time error when called in an assembly other than Doer