c# - 防止实现不是接口(interface)方法的方法

标签 c# .net interface

是否可以在实现接口(interface)的类中阻止公共(public)非接口(interface)方法的实现?

例如

    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!!!
        }
    }

澄清一下,我想在编译时阻止它,而不是在运行时。

最佳答案

如果 C# 能够实现您想要实现的目标,那么该语言本身就会破坏面向对象的编程功能之一:封装

让实现者以他们自己的方式实现您的接口(interface),并关注接口(interface)实现的质量,而不是将您的精力放在不要实现比接口(interface)定义的方法更多的方法 (即实现实现者应通过的单元/集成测试,以证明黑盒确实按预期工作)。

当您使用接口(interface)时,您会遇到黑匣子:您不关心实现如何完成工作,但您关心它是否正确完成工作

摘自您在自己的问题中添加的一些评论:

No specific use case, just want to direct those who use libraries to component oriented functionality and avoid god objects.

您想避免上帝对象,但您想要上帝方法。每个人总是更喜欢关注点分离和分段良好的类,而不是看到 3 个方法,每个方法有 1k 行代码。

OP 说...

What about breaking the single responsibility principle? If a class implementing an interface suddenly starts doing stuff which can easily be a responsibility of other class, isn't it breaking OOP as well?

不,单一职责原则与面向对象编程的定义无关(即继承、多态和封装),但它与代码质量有关。

代码质量无法通过接口(interface)或使用任何自己的编程语言结构来保证。这就是code review的使命.

当然,自动化测试可确保代​​码高质量运行,这不同于高质量编码

关于c# - 防止实现不是接口(interface)方法的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32305759/

相关文章:

c# - 将另一个窗体放在该窗体控件的顶部

c# - 检查实例是否属于某个类型

C# 嵌入式 FTP 服务器

c# - 检索实现给定接口(interface)的对象列表

c# - 注册使用 VS C# 2010 创建的 COM 对象

c# - 想知道一种在 C# 中使用 List<> 和结构来节省内存的方法

java - 如何从类中隐藏不支持的接口(interface)方法

javascript - 如何将接口(interface)从 typescript 转换为 javascript?

c# - 在 C# 中重新排序 BindingList 中的项目?

.net - 有没有办法从 .NET 3.5 中的 System.Collections.Concurrent 获取类?