如何避免为实现Model.IModel接口的类编写样板代码?
避免重复实现IModel接口的样板代码
当然可以摆脱这种繁琐的重复样板代码!在F#里,有几种实用的方式来解决这个问题,下面是两个最适合你场景的方案:
1. 使用抽象基类复用通用实现
最直接的方式是创建一个抽象基类,把所有IModel接口的通用属性实现都放在这里,之后你所有需要实现IModel的类只需要继承这个基类,专注于自己独有的逻辑即可。
示例代码:
// 定义抽象基类,一次性实现所有通用的IModel成员 type BaseModel(modelArg: Model.IModel) = interface Model.IModel with member this.Assets = modelArg.Assets member this.AuxData = modelArg.AuxData member this.Benchmark = modelArg.Benchmark member this.CalcPeriods = modelArg.CalcPeriods member this.CashTicker = modelArg.CashTicker member this.Description = modelArg.Description member this.FirstValidDate = modelArg.FirstValidDate member this.Name = modelArg.Name // 把你所有需要重复实现的属性都在这里完成映射
之后你的具体业务类只需要继承这个基类,不用再写那些重复的接口成员:
// 具体业务类,只需要处理自己独有的逻辑 type PortfolioModel(modelArg: Model.IModel) = inherit BaseModel(modelArg) // 这里添加这个类独有的成员或方法,比如: member this.CalculatePortfolioReturn() = // 自定义业务逻辑 0.0
这种方式的好处是:
- 只需要写一次通用实现,后续所有类都能复用
- 业务类的代码更简洁,专注于自身职责
- 后续如果IModel接口有修改,只需要在基类里调整一次即可
2. 使用对象表达式快速创建实例
如果你的场景不需要定义具体的类,只是需要快速创建一个实现IModel的实例,那么可以用F#的对象表达式来包装modelArg,避免重复写属性映射:
示例代码:
// 封装一个创建IModel实例的函数,复用属性映射逻辑 let wrapModel (modelArg: Model.IModel) = { new Model.IModel with member this.Assets = modelArg.Assets member this.AuxData = modelArg.AuxData member this.Benchmark = modelArg.Benchmark // 同样完成所有属性的映射 }
之后你需要实例的时候,直接调用这个函数即可:
let myModelInstance = wrapModel existingModelArg
这种方式适合临时创建实例、或者不需要长期复用类定义的场景,代码更轻量化。
内容的提问来源于stack exchange,提问作者Soldalma
相关产品推荐
相关产品推荐

