最近我开始注意到我的一些代码中的重复。当然,一旦你注意到重复,它就变成了光栅。这就是我问这个问题的原因。
这个想法是这样的:有时候你会编写同一个类的不同版本:原始版本,锁定版本,只读外观版本等。这些是一个常见的事情,但是翻译很高机械。使用锁获取/释放等环绕所有方法。在动态语言中,您可以编写一个函数来对类的实例执行此操作(例如,迭代所有函数,将其替换为获取/释放a的版本锁)。
我认为我的意思是“反映阶级”。您创建一个转换,它接受一个类,并返回一个修改后的所需方法类。同步是最简单的情况,但还有其他:使类不可变[包装方法,以便克隆,改变克隆,并将其包含在结果中],使类只读[假设您可以识别变异方法],制作类似乎使用类型A而不是类型B等
重要的是,从理论上讲,这些转换在编译时是有意义的。即使ActorModel< T>具有根据T而改变的方法,它们以编译时可知的特定方式依赖于T(ActorModel< T>方法将返回原始结果类型的未来)。
我只是想知道这是用语言实现的,以及它的名称。
答案 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
,其中invocation
和original
将成为这种新颖抽象的关键词。
新类型可以被视为原始类型周围的代理 / 包装 / 适配器。新类型是否仍然代表原始的子类型是另一个问题。抽象支持改变返回类型的距离也是另一个问题。
虽然字节码检测,AOP或自定义类加载器可以实现其中的一部分,但我认为在精神上最接近的匹配是动态代理。动态代理的代码看起来确实很糟糕,类似于我上面写的。 Here,here和here是我用动态代理解决的情况。当然,动态代理不是静态的,但正如名称所说,动态代理。
我担心您描述的一般问题 - 如何创建现有类型的变体 - 过于宽泛。已经针对特定情况提出了类型系统扩展的提议,例如,如何从接口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与您正在谈论的内容有关。