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