【发布时间】:2018-05-08 17:48:02
【问题描述】:
我有许多实现接口的类。每当我定义一个类时,我都必须在类定义中编写类似这样的内容:
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 派生的每个类重复此操作?代码在所有情况下都是相同的。
【问题讨论】:
-
实现接口的基类和从该基类继承的各个实现是我能想到的唯一方法。 (我有点怀疑这里更有趣的部分是更大的上下文和目的,因为很可能完全不同的方法可能更符合 F# 的习惯。)
-
是的,尽可能避免类和继承是 F# 中的一个重要目标,但它是一种多范式语言,在某些情况下使用“对象编程”(如 Don Syme 所说)是必要的或只是更好的方法。但是你提到的事情就是我所说的更大的上下文将是有趣的事情时的意思,因为这可能允许做出完全不同的设计决策。不过,我猜这将是一个不同的问题,并且需要查看更多您可能无法共享的代码。
-
我不介意共享代码,但它会很大而且很麻烦。我将尝试找出一种简单的方法来展示我正在尝试做的事情并将其放在另一个问题中。
-
为什么每堂课都要写这个?拥有大量需要在任何地方包含的属性似乎是一个巨大的设计问题。
-
为什么不能只提供一个默认实现?
标签: inheritance interface f# boilerplate