我是 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) 返回的内容。