扩展方法设计指南:对于sub和super类,类似的方法名称应该是相同的吗?

时间:2011-07-03 21:20:35

标签: .net f#

我刚刚阅读了Krzysztof Cwalina和Brad Abrams的框架设计指南第2版中有关扩展成员的部分,并没有找到这样的例子。我的问题涉及F#库中的超类和子类,但我希望答案与所有​​.NET语言相关。

F#有两种类型,超级类型Expr和子类型Expr<'a>,后者只是前者类型版本的包装器。这些是用于引用表达式的类型。

如果我想在这些类型上定义扩展方法以进行评估,那么这将是一个更好的设计:

  1. 执行F#PowerPack并在EvalUntyped() : Expr -> objExprEval() : Expr<'a> -> 'a上使用不同名称Expr<'a>进行定义。
  2. 如果您拥有类型并使用相同的名称(可以将超类型上的方法视为虚拟,并且子类型上的方法可以被认为是覆盖了超虚方法)。即Eval() : Expr -> obj上的ExprEval() : Expr<'a> -> 'a上的Expr<'a>
  3. 第二种选择对我来说似乎更正确,但我想遵循可能存在的任何设计准则:是否有任何权威优先权(假设他们在PowerPack中“错误”)?

1 个答案:

答案 0 :(得分:1)

可能没有明确的答案。但是,除非你真的相信F#PowerPack确实让设计“错误”,否则我会遵循他们的风格有两个原因:

  1. 使样式与其他开发人员已在F#和官方扩展中使用的内容保持一致。
  2. 更明确地显示两种方法的返回类型的区别,因为它确实很重要。
  3. 您对Tomas的回复中的类比很好,但我认为使用此代码的任何其他开发人员可能不会像您一样关注设计。最好与官方风格保持一致,明确表达你的意图。