静态抽象接口成员实现代数类型系统
利用C# 11静态抽象接口成员模拟代数数据类型(ADT),构建类型安全的表达式求值器。 · 难度:入门 · +10XP
静态抽象接口与ADT
C# 11引入的static abstract interface members允许接口定义静态方法、运算符等。本教程将利用此特性模拟函数式语言中的代数数据类型,例如构建一个Expr接口,其实现类代表常量、加法、乘法等节点。通过接口的静态抽象方法实现求值、打印等操作,无需模式匹配或访问者模式,利用泛型约束实现编译期多态。
public interface IExpr<TSelf> where TSelf : IExpr<TSelf>
{
static abstract TSelf Create(int value);
static abstract TSelf operator +(TSelf left, TSelf right);
int Evaluate();
}
public struct Const : IExpr<Const>
{
private int _val;
public Const(int v) => _val = v;
public static Const Create(int value) => new Const(value);
public static Const operator +(Const left, Const right)
=> new Const(left._val + right._val);
public int Evaluate() => _val;
}
// 使用
var expr = Const.Create(5) + Const.Create(3);
Console.WriteLine(expr.Evaluate()); // 8