我可以避免为从接口派生的 类 编写样板代码吗?
Can I avoid writing boilerplate code for classes that derive from an interface?
我有很多 class 实现了接口。每当我定义 class 我必须在 class 定义中写这样的东西:
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
member this.ParamData = modelArg.ParamData
member this.ParamList = modelArg.ParamList
member this.Strategy = modelArg.Strategy
member this.CalcStartTime with get() = calcStartTime and
set v = calcStartTime <- v
member this.Counter with get() = counter and
set v = counter <- v
有没有办法避免对从接口 IModel 派生的每个 class 重复此操作?所有情况下的代码都是相同的。
为了使讨论更具体一些,由于评论中的 space 有限,下面的内容是否适合您?
type ModelArg = {
Number: int
Name: string
}
type IModel(modelArg: ModelArg) =
abstract member Number: int
abstract member Name: string
default __.Number = modelArg.Number
default __.Name = modelArg.Name
type ConcreteModel1(modelArg: ModelArg) =
inherit IModel(modelArg)
type ConcreteModel2(modelArg: ModelArg) =
inherit IModel(modelArg)
let modelArg1 = {Number=2; Name ="Joe"}
let modelArg2 = {Number=3; Name = "Jim"}
let getNumberAndName(x: IModel) =
(x.Number, x.Name)
let model1 = ConcreteModel1(modelArg1)
let model2 = ConcreteModel2(modelArg2)
getNumberAndName(model1)
//val it : int * string = (2, "Joe")
getNumberAndName(model2)
//val it : int * string = (3, "Jim")
我有很多 class 实现了接口。每当我定义 class 我必须在 class 定义中写这样的东西:
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
member this.ParamData = modelArg.ParamData
member this.ParamList = modelArg.ParamList
member this.Strategy = modelArg.Strategy
member this.CalcStartTime with get() = calcStartTime and
set v = calcStartTime <- v
member this.Counter with get() = counter and
set v = counter <- v
有没有办法避免对从接口 IModel 派生的每个 class 重复此操作?所有情况下的代码都是相同的。
为了使讨论更具体一些,由于评论中的 space 有限,下面的内容是否适合您?
type ModelArg = {
Number: int
Name: string
}
type IModel(modelArg: ModelArg) =
abstract member Number: int
abstract member Name: string
default __.Number = modelArg.Number
default __.Name = modelArg.Name
type ConcreteModel1(modelArg: ModelArg) =
inherit IModel(modelArg)
type ConcreteModel2(modelArg: ModelArg) =
inherit IModel(modelArg)
let modelArg1 = {Number=2; Name ="Joe"}
let modelArg2 = {Number=3; Name = "Jim"}
let getNumberAndName(x: IModel) =
(x.Number, x.Name)
let model1 = ConcreteModel1(modelArg1)
let model2 = ConcreteModel2(modelArg2)
getNumberAndName(model1)
//val it : int * string = (2, "Joe")
getNumberAndName(model2)
//val it : int * string = (3, "Jim")