是否有推荐的方法来模拟F#中的多个继承级别,可能是使用区分联合? 在C#中使用以下内容: class Expr { }class SourceExpr : Expr { }class JoinExpr : SourceExpr { }class TableExpr : SourceExpr { } 我在F#中做到
在C#中使用以下内容:
class Expr { } class SourceExpr : Expr { } class JoinExpr : SourceExpr { } class TableExpr : SourceExpr { }
我在F#中做到了这一点:
type SourceExpr = | Join of JoinExpr | Table of TableExpr type Expr = | Source of SourceExpr | ...
有没有更好的办法?这是否提供与继承相同的多态行为?
没有更多信息,这里很难过于规范.根据您要执行的操作,使用类层次结构或区分联合(DU)可能更有意义.最常见/最常见的权衡是类层次结构是“开放的”而DU是“封闭的”.也就是说,您可以轻松地将新类型添加到类层次结构中,但添加新操作(基类上的抽象方法)需要更改所有现有类.相反,使用DUs,您可以轻松添加新操作(模式匹配数据类型的功能),但是要添加新案例(子类),您必须重新定义类型并更新所有现有操作以处理新案例. (这有时被称为“表达问题”.)一个对DUs有益的典型例子是编译器;你有一个语言抽象语法树,其中语言和树结构是固定的,但你可以在编译器内编写许多不同的树变换操作.适用于类层次结构的典型示例是UI框架;你有一些基类定义了小部件必须提供的所有操作(Draw,Resize,…),但用户将添加自己的自定义子类型和额外的功能.