F#抽象类中能否使用abstract override修饰成员?
在F#中强制派生类实现System.Object基方法的方式
当然可以!虽然F#的语法和C#有所不同,但你完全能实现类似C#中abstract override的效果,强制派生类必须实现System.Object的基方法(比如ToString())。
在F#里,你只需要在抽象类中声明一个与目标基方法签名完全匹配的抽象成员,这样所有继承该抽象类的派生类就必须实现这个成员(否则会触发编译错误),从而达到强制重写基类方法的目的。
示例代码
首先定义抽象类,强制派生类实现ToString():
[<AbstractClass>] type Base() = // 声明抽象的ToString成员,签名与System.Object.ToString一致 abstract member ToString : unit -> string
然后创建派生类,必须实现ToString()才能通过编译:
type Derived() = inherit Base() // 必须override实现抽象成员,同时覆盖System.Object的ToString override this.ToString() = "我是Derived类的ToString实现"
如果派生类没有实现这个抽象成员,编译器会直接报错,提示你“类型'Derived'没有为抽象成员'ToString : unit -> string'提供实现”,完美达到了强制派生类重写的效果。
补充说明
和C#的abstract override写法不同,F#不需要显式的关键字组合,通过抽象成员的声明就可以约束派生类。本质上,这是因为System.Object的ToString()本身是虚拟方法,派生类的override会同时覆盖抽象类的抽象成员和基类的虚拟方法,最终实现和C#一样的强制效果。
内容的提问来源于stack exchange,提问作者bentayloruk
相关产品推荐
相关产品推荐

