来自C#背景的F#。
在C#中,决定何时使用接口以及何时使用抽象类有明显的区别。在F#中,我看到两个模糊几乎合二为一。据我所知,就CLR而言,在F#中就c#做了同样的事情,但在使用F#进行编程时,“最佳实践”是什么?
我应该完全避免类继承吗?
答案 0 :(得分:5)
我认为接口往往比抽象类更频繁地使用(与C#等面向对象语言相比)。
在许多情况下,您不需要这两者中的任何一个,因为您可以只编写高阶函数(将函数作为参数,而不是将接口作为参数)。但是,有时您可能有两个总是一起使用的函数 - 在这种情况下,您可以将两个函数分组到一个接口中:
// Instead of using higher-order function
val foo : (int -> string) -> (string -> int) -> ...
// ..we can define an interface
type TwoWayConversion =
abstract ToString : int -> string
abstract FromString : string -> int
val foo : TwoWayConversion -> ...
我认为这是非常有用的F#编程模式,它以完美的功能样式使用接口。
另一方面,我只会在编写应该从C#中使用的面向对象的代码时使用抽象类(例如,实现你的F#抽象类的C#代码) - 因为这是C#点的自然扩展点。视图。但是,我认为惯用的F#代码使用与C#不同的可扩展性点(例如将函数/接口作为参数),因此您不需要抽象类。
答案 1 :(得分:3)
好吧,如果您在抽象类和接口之间进行辩论,我认为您的原因与C#中的原因相同。 也许您应该考虑使用函数,函数数据类型和模块作为抽象单元。 如果您需要编写要在C#中使用的F#库,那么您可能希望为导出的类型使用接口等。