是否存在任何语言:
基本上,在伪代码中,我想要这个:
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、锡兰):
顺便说一句:当我尝试将 Java 对监听器的支持放入单独的类时,我想到了这个问题(在许多类中有: List
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++ 中,问题是继承函数隐藏。也可以看看
Function with same name but different signature in derived class
和
Why does an overridden function in the derived class hide other overloads of the base class?
编辑 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:我还应该检查任何支持 mixins 的编程语言:http://en.wikipedia.org/wiki/Mixins#Programming_languages_that_use_mixins
mixin(GenerateSomething!("IfClassNameHereManualRenaming"));
编辑 4:添加“Gosu”语言注释。
编辑 5:Gosu 编程语言已更新 0.10.2,修复了接口(interface)损坏问题。然而,即使他们声称已经具体化了泛型和委托(delegate),委托(delegate)+具体化的泛型也不起作用。
最佳答案
C++:类似于 CRTP ( see comment to 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
指示。因此,数量仅取决于当前类中成员函数的数量,而不取决于基类。它在某些方面与多重继承不同,但它允许简单的函数重载。
如果基类只共享一些但不是所有的成员函数,那就更棘手了。
关于templates - 具有特征和函数重载的静态类型语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17871024/