1

我是 F# 新手。

我有 2 个类,Base 和 Derived。

Base 有很多方法。Derived 按原样继承了一些方法,并覆盖了一些方法。派生类也引入了新方法。

我有一组对象,有些是基础的,有些是派生的。

有一个 2 个元素元组的列表,元组的第二个元素是多态层次结构的方法。

让我们考虑一下我的程序,它读取输入并且每个输入都通过列表,将每个元组的第一个元素(谓词)应用于输入。

如果谓词为真,则它在一个可以是 Base 或 Derived 的对象上调用元组的第二个元素(再次取决于元组的第一个元素的值)。

最好有一个这样的元组列表,而不是现在的 2 个列表(一个用于 Base,一个用于 Derived)。这可能吗?

假设基类定义了method1和method2。

假设 Derived 类定义(覆盖)method2 和 method4。

let predList = 
  [(predicate1, Base.method1);
  (predicate2, method2);
  (predicate4; Derived.method4) 
  ... 
]

 while ... do
     let input = ReadInput
     if IsBase(input)
         then 
             let method = List.Find matchingPredicate predList
             let baseObj = ChooseBaseObject(input)
             baseObj.method  // ????
         else 
             let method = List.Find matchingPredicate predList
             let derivedObj = ChooseDerivedObject(input)
             derivedObj.method  // ????

使用这样的代码,满足 predicate2 的给定输入可能会触发对 Derived.method2 或 Base.method2 的调用,具体取决于 IsBase(input) 返回的内容。

4

1 回答 1

1

最简单的事情可能是将你method的 's 包装成一组独立的函数:

let wrap_method1 (x :Base) = x.method1()
let wrap_method2 (x :Base) =
   match x with
   | :? Derived as xd -> xd.method2()
   | _ -> x.method2()
let wrap_method4 (x :Base) =
   match x with
   | :? Derived as xd -> xd.method4()
   | _ -> ()

// use
let predList = 
    [(predicate1, wrap_method1);
    (predicate2, wrap_method2);
    ... ]

while ... do
    let input = ReadInput
    let method = List.Find matchingPredicate predList
    method input
于 2012-09-30T05:01:30.533 回答