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

WeN*_*ers 2 f#

来自C#背景的F#.

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

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

Tom*_*cek 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 -> ...
Run Code Online (Sandbox Code Playgroud)

我认为这是一个非常有用的F#编程模式,它使用完美功能的接口.

另一方面,我只在编写应该从C#中使用的面向对象的代码时使用抽象类(例如,实现你的F#抽象类的C#代码) - 因为从C#的角度来看,这是一个自然的可扩展性点.但是,我认为惯用的F#代码使用与C#不同的可扩展点(例如,将函数/接口作为参数),因此您不需要抽象类.

  • 顺便说一句,在考虑过去几年我在C#中编写代码的方式之后,我倾向于完全偏离类继承并使用组合,使用接口和泛型,并使用委托提供一些帮助.也许对象已经死了,建模行为是新模型? (2认同)