gpt4 book ai didi

wpf - 如何创建包含具有公共(public)父类(super class)的对象的 F# 列表?

转载 作者:行者123 更新时间:2023-12-02 20:53:15 24 4
gpt4 key购买 nike

我有两个函数,水平和垂直,用于布局控件。他们的工作方式如下:

let verticalList = vertical [new TextBlock(Text = "one"); 
new TextBlock(Text = "two");
new TextBlock(Text = "three")]

现在verticalList是一个垂直显示三个文本 block 的控件:

one
two
three

以下是定义:

let horizontal controls = 
let wrap = new WrapPanel() in
List.iter (wrap.Children.Add >> ignore) controls ;
wrap

let vertical controls =
let stack = new StackPanel() in
List.iter (stack.Children.Add >> ignore) controls ;
stack

当我组合不同类型时出现问题:

let foo = vertical [new TextBlock(Text = "Title"); vertical items]

这提示列表的元素不是同一类型。确实如此,但它们有一个共同的父类(super class)型 (UIElement)。

我知道我可以使用 :> UIElement 来向上转换列表中的两个项目,但这是一个丑陋的解决方案。 F# 可以推断公共(public)父类(super class)型吗?如果没有,为什么不呢?

如果能好看就太好了

vertical [X; Y; Z]

不一定要成为

vertical [(X :> UIElement); (Y :> UIElement); (Z :> UIElement)]

最佳答案

有几种方法,包括

type Animal() = class end
type Cat() =
inherit Animal()
type Dog() =
inherit Animal()
let animals1 : list<Animal> = [upcast new Cat(); upcast new Dog()]
let animals2 = ([upcast new Cat(); upcast new Dog()] : list<Animal>)
let animals3 = [(new Cat() :> Animal); upcast new Dog()]

animals1:var声明处的类型注释,向上转换每个元素

animals2:在列表表达式上键入注释,向上转换每个元素

animals3:第一个元素上的显式类型,向上转型休息

在 F# 的 future 版本中,向上转换可能会变得不必要。

(另请参阅 http://cs.hubfs.net/forums/thread/9953.aspx ,但没有什么"new"内容。)

关于wpf - 如何创建包含具有公共(public)父类(super class)的对象的 F# 列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/937157/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com