静态类型的语言与特性和函数重载?
是否存在任何语言:
- 是静态(强烈)键入
- 支持泛型(模板)
- 支持特性/多重继承/接口委派
- 允许函数重载(也是继承的成员)
基本上,在伪代码中,我想这样做:
class Template<SomeType> { void function(SomeType i) {} } class Composed extends Template<int>, Template<double> { }; Composed composed; composed.function(3); //calls function(int) composed.function(2.5); //calls function(double)
从维基列表http://en.wikipedia.org/wiki/Multiple_inheritance#Implementations我试图用下面的编程语言编写代码(我还包括最新的尚未发布的1.0版本(2013年)的语言,如Kotlin,锡兰):
- C ++几乎可能,但不能解决组合变量的重载函数
- Scala编译错误:特征继承两次; 即使被间接继承欺骗,它仍然会产生错误; 另请参阅其他人在Scala中关于多个泛型混合继承的问题
- 埃菲尔编译错误:没有函数重载
- 锡兰特征不能有变量(也没有保护成员,所以没有把数据存储在派生类中的技巧,锡兰特征是无用的)
- Fantom没有泛型/模板
- Kotlin编译错误:超类型出现两次; 代表团看起来是独一无二的,但没有用处,因为可以既不访问受保护的成员,也不访问委派的变量
- 铁锈无功能重载; 性状不能存储数据; 特征不能有定义的方法(与身体) – 正在处理的问题;
- OCaml编译错误:没有函数重载; 它也没有检查我的函数的参数类型,所以如何“静态类型”它真的是?
- 卷曲编译错误:没有函数重载; 它也不检查函数体,除非被调用,那么“静态类型”是如何呢? 是根本编译还是解释?
- Gosu是一个不好的笑话,它根本不可用:不能用一个方法编写和实现简单的接口(错误:ClassFormatError:非法字段修饰符)。 谁实际上使用这种语言?
顺便说一句:我想这个问题,当我试图把听众的Java支持到单独的类(在许多类中有:List <ListenerType> … addListener(…)… removeListener(…) )
C ++ 几乎可以工作:
template <typename T> class Template { public: void function(T i) {} }; class Composed : public Template<int>, public Template<double> { }; Composed composed; composed.Template<int>::function(3); //i want: composed.function(3); ((Template<double>&)composed).function(2.5); //i want: composed.function(2.5);
编辑:在C ++中,问题是继承函数隐藏。 派生类中具有相同名称但具有不同签名 的函数以及为什么 派生类 中的重写函数隐藏了基类的其他重载?
编辑2:在C ++中,使用模板和部分特化,有可能使脏特技更简单:
#include <iostream> #include <typeinfo> class Void { }; template <class A, class B> class CleverTrait; template <class A, class B> class CleverTrait; template <class A> class CleverTrait<A, Void> { public: void function(A arg) { std::cout << "Hello for type " << typeid(A).name() << std::endl; } }; template <class A, class B> class CleverTrait<A, CleverTrait<B, Void> > : public CleverTrait<B, Void> { public: using CleverTrait<B, Void>::function; void function(A arg) { std::cout << "Hello for type " << typeid(A).name() << std::endl; } }; class ComposedByClever : public CleverTrait<double, CleverTrait<int, Void> > { }; int main() { ComposedByClever composedByClever; composedByClever.function(5); composedByClever.function(2.3); return 0; }
这意味着C ++中的这个特殊的例子是有效的 ,但是如果不相关的特征共享函数名,那么在C ++中就没有办法继承和使用所有的函数。
编辑3:我也应该检查任何支持mixin的编程语言: http : //en.wikipedia.org/wiki/Mixins#Programming_languages_that_use_mixins
- D工作,但只能通过字符串操作mixin,所以重构在这种情况下被打破 :
mixin(GenerateSomething!("IfClassNameHereManualRenaming"));
编辑4:添加“Gosu”语言评论。
编辑5:Gosu编程语言有更新0.10.2修复了接口的问题。 但是,即使他们声称具有统一的泛型和委托,委托+泛化泛型也不起作用。
C ++:与CRTP相似的奇怪想法( 参见OP的评论 )我的意思是更像是:
#include <typeinfo> #include <iostream> struct Dummy { private: // dummy type to prevent overload resolution from ever choosing this overload struct ParamDummy { explicit ParamDummy(); }; public: void function(ParamDummy); }; template<typename T, typename Base = Dummy> struct Template : Base { using Base::function; void function(T i) { std::cout << typeid(T).name() << std::endl; } }; struct SecondBaseClass { void function2() { std::cout << "function2" << std::endl; } }; struct Composed : Template<int, Template<double>>, SecondBaseClass {}; int main() { Composed c; c.function(5.0); c.function(5); c.function2(); }
对于Template
每个不同的成员函数名称,都需要一个using
指令。 因此,数字仅取决于当前类中成员函数的数量,而不取决于基类。
它在一些方面与多重继承不同,但它允许一个简单的函数重载。
如果基类只共享一些但不是全部的成员函数,就会变得复杂。