来自C#背景的F#.
在C#中,决定何时使用接口以及何时使用抽象类有明显的区别.在F#中,我看到两个模糊几乎合二为一.据我所知,就CLR而言,在F#中就c#做了同样的事情,但在使用F#进行编程时,"最佳实践"是什么?
我应该完全避免类继承吗?
我认为接口往往比抽象类更频繁地使用(与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#不同的可扩展点(例如,将函数/接口作为参数),因此您不需要抽象类.