代码之家  ›  专栏  ›  技术社区  ›  jdehaan

抽象阻碍了自定义类型的使用,在实现中要遵循哪些规则?

  •  0
  • jdehaan  · 技术社区  · 14 年前

    我已经构建了一个自定义的类型系统,用于在应用程序中编写C脚本。脚本是动态编译的,允许与应用程序内部数据交互。这个类型系统是以抽象的方式设计的,使用了如下接口 IValue . 实施 可能是 RefString , RefInteger RefDouble (除其他外,这足以说明我的问题)。

    伊瓦卢 物体有点不自然。始终使用接口与对象交互被认为是一个好的设计,但不可能为接口定义隐式转换或重载运算符。这种情况下,丑陋的显式转换是不可避免的,以便使用正确的运算符。

    IValue Add(IValue a, IValue b)
    {
        //return a+b; // won't work: which operator +() to use?
        return (RefInteger)a + (RefInteger)b;
    }
    

    对于涉及值类型的表达式中的C,提供隐式转换。设计这样一个定制系统的好方法是什么?

    我重写了打字系统 伊瓦卢 RefValue 基类。这样就可以消除部分显式类型转换。我在这个基类中实现了一些运算符重载,但是这给默认的转换运算符带来了很多麻烦。。。除此之外,要在运算符实现中实现的逻辑还包含许多有关系统中类型的知识。我认为这仍然是一个必须走的道路,但有什么规则要遵循,以一个良好和安全的方式实施这一点?

    编辑 :经过一段时间的挣扎,我可以发现一些规则是:

    • 仅声明基类型(int、double、string,…)中的隐式转换运算符
    • 声明显式转换为基类型(以避免隐式转换为int!!什么事情经常发生,但为什么?)
    1 回复  |  直到 14 年前
        1
  •  1
  •   Fredrik Mörk    14 年前

    如果你能 Add 全部操作 IValue s、 也许接口应该包括 添加 return a.Add(b); ,并将如何执行操作的知识推送到每种类型中。

    一个问题是,现在看来,你可以在 a RefString b RefInteger

    T Add<T>(T a, T b) where T : IValue
    {
        return a.Add(b);
    }
    

    (当然,您需要添加空检查,如适当)

    推荐文章