这是两个 F# 场景。我有一个抽象类:
type IAbstractObj =
abstract DoSomething : bool -> bool
场景一:
我将接口实现为一种类型:
type ConcreteObj =
interface IAbstractObj with
member this.DoSomething bool = true
然后通过实例化在应用程序中使用它:
let foo = new ConcreteObj();
场景二:
我用 let 绑定绑定了该类型的一个实例,并将其用作“自由函数持有者”:
let ConcreteObj = {
new IAbstractObj with
member this.DoSomething bool = true
}
并像这样使用它:
let foo = ConcreteObj
这些用法之间有什么区别?在任何一种情况下,类型都不需要保存任何额外的运行时状态。
- 会有性能差异(微小)吗?对于包含“let”绑定的模块,内存是否只分配给在应用程序的其他部分实际评估的绑定?
- 场景 1 会分配少量内存来保存指向实例的指针(即使它是无状态的)?
这对我的申请相当重要。我为不包含任何实例状态的验证器和序列化器使用了许多接口。以我的 C# 背景,我习惯于创建一个继承接口的类的实例,即使它具有无参数的构造函数并且显然只是本质上静态函数的持有者。