静态类型的语言与特性和函数重载?

是否存在任何语言:

  • 是静态(强烈)键入
  • 支持泛型(模板)
  • 支持特性/多重继承/接口委派
  • 允许函数重载(也是继承的成员)

基本上,在伪代码中,我想这样做:

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指令。 因此,数字仅取决于当前类中成员函数的数量,而不取决于基类。

它在一些方面与多重继承不同,但它允许一个简单的函数重载。

如果基类只共享一些但不是全部的成员函数,就会变得复杂。

Interesting Posts