我正在开发一组实现通用接口的类.我的库的使用者应该期望这些类中的每一个都实现一组静态函数.无论如何,我可以装饰这些类,以便编译器能够捕获其中一个函数未实现的情况.
我知道在构建消费代码时最终会被捕获.而且我也知道如何使用一种工厂类解决这个问题.
只是想知道是否有任何语法/属性要求类上的静态函数.
Ed删除了"界面"这个词以避免混淆.
不,C#中没有语言支持.我可以立即想到两种解决方法:
在运行时使用反射; 交叉的手指和希望......
使用singleton/default-instance/similar来实现声明方法的接口
(更新)
实际上,只要你有单元测试,第一个选项实际上并不像你想象的那样(如我)你来自严格的"静态类型"背景.事实上; 它在动态语言中运行良好.事实上,这正是我的泛型运算符代码的工作原理 - 它希望你有静态运算符.在运行时,如果你不这样做,它会以适当的嘲弄语气嘲笑你......但它无法在编译时检查.
没有.基本上听起来你是在追求一种"静态多态".这在C#中不存在,尽管我已经提出了一种"静态接口"概念,它在泛型方面很有用.
您可以做的一件事是编写一个简单的单元测试来验证特定程序集中的所有类型是否符合您的规则.如果其他开发人员也将实现该接口,您可以将该测试代码放入一些常见位置,以便实现该接口的每个人都可以轻松地测试他们自己的程序集.
这是一个很好的问题,也是我在项目中遇到的问题.
有些人认为接口和抽象类只存在于多态,而不是强制类型实现某些方法.就个人而言,我认为多态性是主要用例,并强制实现次要.我经常使用强制实现技术.通常,它出现在实现模板模式的框架代码中.base/template类封装了一些复杂的想法,子类通过实现抽象方法提供了许多变体.一个实用的好处是抽象方法为实现子类的其他开发人员提供了指导.Visual Studio甚至可以为您存储方法.当维护开发人员需要在几个月或几年后添加新的子类时,这尤其有用.
缺点是C#中的某些模板方案没有特定的支持.静态方法是一种.另一个是构造函数; 理想情况下,ISerializable应该强制开发人员实现受保护的序列化构造函数.
最简单的方法可能是(如前所述)使用自动化测试来检查静态方法是否在所需类型上实现.已经提到的另一个可行的想法是实现静态分析规则.
第三种选择是使用面向方面的编程框架,如PostSharp.PostSharp支持方面的编译时验证.您可以编写在编译时反映程序集的.NET代码,生成任意警告和错误.通常,您这样做是为了验证方面使用是否合适,但我不明白为什么您也不能使用它来验证模板规则.