在F#中使用哪个,抽象类或接口?

时间:2010-06-24 10:17:37

标签: f#

来自C#背景的F#。

在C#中,决定何时使用接口以及何时使用抽象类有明显的区别。在F#中,我看到两个模糊几乎合二为一。据我所知,就CLR而言,在F#中就c#做了同样的事情,但在使用F#进行编程时,“最佳实践”是什么?

我应该完全避免类继承吗?

2 个答案:

答案 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#库,那么您可能希望为导出的类型使用接口等。