这个概念是否有一个术语,它是否以静态类型语言存在?

时间:2010-05-13 03:50:23

标签: types theory naming

最近我开始注意到我的一些代码中的重复。当然,一旦你注意到重复,它就变成了光栅。这就是我问这个问题的原因。

这个想法是这样的:有时候你会编写同一个类的不同版本:原始版本,锁定版本,只读外观版本等。这些是一个常见的事情,但是翻译很高机械。使用锁获取/释放等环绕所有方法。在动态语言中,您可以编写一个函数来对类的实例执行此操作(例如,迭代所有函数,将其替换为获取/释放a的版本锁)。

我认为我的意思是“反映阶级”。您创建一个转换,它接受一个类,并返回一个修改后的所需方法类。同步是最简单的情况,但还有其他:使类不可变[包装方法,以便克隆,改变克隆,并将其包含在结果中],使类只读[假设您可以识别变异方法],制作类似乎使用类型A而不是类型B等

重要的是,从理论上讲,这些转换在编译时是有意义的。即使ActorModel< T>具有根据T而改变的方法,它们以编译时可知的特定方式依赖于T(ActorModel< T>方法将返回原始结果类型的未来)。

我只是想知道这是用语言实现的,以及它的名称。

4 个答案:

答案 0 :(得分:2)

如果我理解得很好,您希望能够通过现有类型的转换生成新的类/类型。像

这样的东西
class Synchronized<T> {
    Object invocation( Object ... args ) {
        synchronize( this ) {
            return original.invocation( args );
        } 
    }
}
...
Foo f;
Synchronized<Foo> f2;
f.bar();
f2.bar(); // would be valid for the type-system

,其中invocationoriginal将成为这种新颖抽象的关键词。

新类型可以被视为原始类型周围的代理 / 包装 / 适配器。新类型是否仍然代表原始的子类型是另一个问题。抽象支持改变返回类型的距离也是另一个问题。

虽然字节码检测,AOP或自定义类加载器可以实现其中的一部分,但我认为在精神上最接近的匹配是动态代理。动态代理的代码看起来确实很糟糕,类似于我上面写的。 Hereherehere是我用动态代理解决的情况。当然,动态代理不是静态的,但正如名称所说,动态代理。

我担心您描述的一般问题 - 如何创建现有类型的变体 - 过于宽泛。已经针对特定情况提出了类型系统扩展的提议,例如,如何从接口X到Y创建一个适配器,以便X的所有具体实现也可以看作是Y的实现。

也许看看这些论文(我还没有读过它们,但我打算):

对于最后一个,摘要说:

  

我们讨论确切的好处和   我们的延期费用   标准介绍,并说明   统一可用的有用性   代理通过实现未来的方法   安全和调用   透明。

,这是你的一个问题。

很酷的问题顺便说一下,我希望你的问题有一个普遍的解决方案。我不假装是这个主题的专家,所以甚至可能有一个,但我不知道。

答案 1 :(得分:1)

答案 2 :(得分:0)

你不能用模板做这个吗?这有点像hackish,但有点像:

#define LOCKED = true;
#define UNLOCKED = false;

template<bool lock>
void doStuff(){
    if(lock){
        // get lock
    }
    // other code
    if(lock){
        // release lock
    }
}

答案 3 :(得分:0)

Python有decorators与您正在谈论的内容有关。

相关问题