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

Types 这个概念是否有一个术语,它是否存在于静态类型语言中?,types,theory,naming,Types,Theory,Naming,最近我开始注意到我的一些代码中有重复。当然,一旦你注意到重复,它就会变得刺耳。这就是为什么我要问这个问题 这个想法是这样的:有时您会为同一个类编写不同的版本:原始版本、锁定版本、只读外观版本等等。这些都是对类执行的常见操作,但翻译是高度机械化的。在动态语言中,您可以编写一个函数,对类的实例执行此操作(例如,迭代所有函数,用获取/释放锁的版本替换它们) 我认为我所说的“反映类”是一个很好的术语。您创建了一个转换,该转换接受一个类,并返回一个修改后的类。同步是最简单的情况,但也有其他情况:使类不可变

最近我开始注意到我的一些代码中有重复。当然,一旦你注意到重复,它就会变得刺耳。这就是为什么我要问这个问题

这个想法是这样的:有时您会为同一个类编写不同的版本:原始版本、锁定版本、只读外观版本等等。这些都是对类执行的常见操作,但翻译是高度机械化的。在动态语言中,您可以编写一个函数,对类的实例执行此操作(例如,迭代所有函数,用获取/释放锁的版本替换它们)

我认为我所说的“反映类”是一个很好的术语。您创建了一个转换,该转换接受一个类,并返回一个修改后的类。同步是最简单的情况,但也有其他情况:使类不可变[包装方法以便它们克隆、变异克隆并将其包含在结果中]、使类只读[假设可以识别变异方法]、使类看起来与类型a而不是类型B一起工作,等等

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


我只是想知道这是否是用一种语言实现的,它叫什么。

你不能用模板来实现吗?这可能有点粗俗,但有点像:

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

template<bool lock>
void doStuff(){
    if(lock){
        // get lock
    }
    // other code
    if(lock){
        // release lock
    }
}
#define LOCKED=true;
#定义UNLOCKED=false;
模板
void doStuff(){
如果(锁定){
//上锁
}
//其他代码
如果(锁定){
//释放锁
}
}

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

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
类同步{
对象调用(对象…参数){
同步(此){
返回原始调用(args);
} 
}
}
...
福福;
同步f2;
f、 bar();
f2.bar();//将对类型系统有效
,其中,
invocation
original
将是这种新颖抽象的关键词

新类型可以看作是围绕原始类型的代理/包装/适配器。新类型是否仍然代表原始类型的子类型则是另一个问题。抽象将在多大程度上支持更改返回类型也是另一个问题

虽然字节码插装、AOP或自定义类加载器可以实现其中的一部分,但我想说,在精神上最接近的匹配是动态代理。动态代理的代码与我上面写的非常相似,这些都是我用动态代理解决的问题。当然,动态代理不是静态的,而是顾名思义,动态的

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

也许可以看看这些文件(我还没有全部读过,但我计划):

最后一个,摘要说:

我们讨论了确切的好处和好处 我们的扩展成本以 标准介绍,并举例说明 一致可用性的有用性 通过实现future方法实现代理 调用既安全又可靠 透明的

,这是你的问题之一


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

Python有哪些与您所说的相关的功能。

我不知道。我从未真正探索过C++模板的局限性。他们可以创建一个方法基于子类方法的类吗?您可以创建子类的一个实例作为成员变量,然后使用它的方法吗?或者,如果它们是静态函数,您可以将它们用作
子类名称::functionName()
这听起来肯定很相似,并且涵盖了一些情况。但是,使用方面,我可以接受一个类并让方法返回未来值而不是正常值吗?通常不能使用AOP更改返回类型,一点是使用它的代码不知道方面。我认为装饰器应用于类的定义,而不是实例化。另外,我特别询问了静态情况,因为动态语言使这些转换相对容易。@Strilan:我读你的问题的速度比我当时应该读的快。但装饰器只是应用于类的函数,原则上,您可以装饰类并在本地实例化对象。