当前位置 : 主页 > 手机开发 > 其它 >

f# – 使用受歧视的联合对多个继承级别进行建模

来源:互联网 收集:自由互联 发布时间:2021-06-19
是否有推荐的方法来模拟F#中的多个继承级别,可能是使用区分联合? 在C#中使用以下内容: class Expr { }class SourceExpr : Expr { }class JoinExpr : SourceExpr { }class TableExpr : SourceExpr { } 我在F#中做到
是否有推荐的方法来模拟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,…),但用户将添加自己的自定义子类型和额外的功能.

网友评论