我刚刚阅读了Krzysztof Cwalina和Brad Abrams的框架设计指南第2版中有关扩展成员的部分,并没有找到这样的例子。我的问题涉及F#库中的超类和子类,但我希望答案与所有.NET语言相关。
F#有两种类型,超级类型Expr
和子类型Expr<'a>
,后者只是前者类型版本的包装器。这些是用于引用表达式的类型。
如果我想在这些类型上定义扩展方法以进行评估,那么这将是一个更好的设计:
EvalUntyped() : Expr -> obj
上Expr
和Eval() : Expr<'a> -> 'a
上使用不同名称Expr<'a>
进行定义。Eval() : Expr -> obj
上的Expr
和Eval() : Expr<'a> -> 'a
上的Expr<'a>
。第二种选择对我来说似乎更正确,但我想遵循可能存在的任何设计准则:是否有任何权威优先权(假设他们在PowerPack中“错误”)?
答案 0 :(得分:1)
可能没有明确的答案。但是,除非你真的相信F#PowerPack确实让设计“错误”,否则我会遵循他们的风格有两个原因:
您对Tomas的回复中的类比很好,但我认为使用此代码的任何其他开发人员可能不会像您一样关注设计。最好与官方风格保持一致,明确表达你的意图。