你如何强制构造函数签名和静态方法?

Skl*_*vvz 24 c# java oop language-features language-design

有没有办法强制(子)类在C#或Java中使用具有特定签名或特定静态方法的构造函数?

你不能明显地使用接口,我知道它的用途有限.我发现它有用的一个实例是当你想强制执行一些设计指南时,例如:

例外
他们应该都有四个规范构造函数,但没有办法强制执行它.你必须依靠像FxCop(C#case)之类的工具来捕获它们.

运算符
没有合约指定可以求和两个类(在C#中使用operator +)

是否有任何设计模式可以解决这个限制?在未来版本的C#或Java中,可以在语言中添加哪些构造来克服此限制?

Jon*_*eet 10

使用泛型,您可以强制类型参数具有无参数构造函数 - 但这是关于它的限制.

除了泛型之外,实际使用这些限制即使它们存在也很棘手,但它有时对类型参数/参数有用.允许接口(或可能是静态接口)中的静态成员同样可以帮助解决"通用数字运算符"问题.

写了一篇关于这个面临着类似的问题,当一小会儿前.


Mar*_*ell 8

在编译时没有强制执行,但我花了很多时间研究类似的问题; 一个支持泛型的数学库,以及一个有效的(非默认的)ctor API都可以在MiscUtil中使用.但是,这些仅在运行时首次使用时进行检查.实际上这不是一个大问题 - 您的单元测试应该很快找到任何缺少的操作符/ ctor.但它很有效,但很快......


jru*_*lph 6

您可以使用Factory模式.

interface Fruit{}

interface FruitFactory<F extends Fruit>{
   F newFruit(String color,double weight);

   Cocktail mixFruits(F f1,F f2);
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以为任何类型的Fruit创建类

class Apple implements Fruit{}
class AppleFactory implements FruitFactory<Apple>{
   public Apple newFruit(String color, double weight){
       // create an instance
   }
   public Cocktail mixFruits(Apple f1,Apple f2){
       // implementation
   }
}
Run Code Online (Sandbox Code Playgroud)

这并不强制您不能以使用Factory的方式创建实例,但至少可以指定要从Factory请求的方法.