我怎样才能(在运行时)决定从我的函数返回哪种类型?
这可能吗?
我认为这是一个不能确定的问题。返回不同类型
返回不同类型
回答
使用多态性
public interface MyType {
public void doSomething();
}
public class A implements MyType {
public void doSomething(){}
}
public class B implements MyType {
public void doSomething(){}
}
public class MyClass {
public MyType getData(){
if (/* some condition */){ return new A(); }
return new B();
}
public void test(){
MyType o = this.getData();
o.doSomething();
}
}
然后简单地返回MyType
类型,并直接在该对象上调用doSomething()
;即你不需要知道返回的类型是A
还是B
。你所关心的是它实现doSomething
。这是多态之美,即没有更多的丑陋is
,getType
,instanceOf
(JAVA)等
误导,这是一个Java答案为一个C++的问题,不是一个真正的答案对于这个问题,而是对OP可能不适用的替代方案的建议。请看标签。 – 2012-03-05 12:16:50
这个例子是Java,问题是关于C++。不过,如果你只关心用户定义的类型,你可以在C++中做基本相同的事情。你不能在C++中做的事就是返回Object,因为C++不会自动强制所有的类继承一个公共的根类型。 – bames53 2012-03-05 12:20:14
@Jacobo你认真吗?谁关心语言,它是相同的原则无关紧要,如果它是C++,C#,Java,PHP,...... – scibuff 2012-03-05 12:21:52
如果使用Boost是一个选项,可以考虑使用Boost.Variant。
在类固醇上,您可以将变体想像为union
。它适用于大多数C++类型,并且允许编译时和运行时多态性,但它不需要类型的通用基类。 主要的缺点是它涉及大量的模板元编程,所以它会给编译器带来一些负担。
这里有一个简短的例子来理解这个概念:
typedef boost::variant<float, std::string> MyVariant;
MyVariant GetInt() { return MyVariant(42); }
MyVariant GetString() { return MyVariant("foo"); }
MyVariant v;
//run-time polymorphism:
int number = boost::get<int>(v); // this line may throw (basically a dynamic_cast)
//compile time polymorphism:
boost::apply_visitor(Visitor(), v);
// where Visitor is a functor overloading operator() for *all* types in the variant
更轻质的选择是Boost.Any,看到this page了比较。
Boost.Any是一个非常重要的选择,因为它涉及到删除类型。但+1推荐Boost.Variant。 – ildjarn 2012-03-05 19:16:25
轻量化可能是一个糟糕的选择。我想说的是,Any比imiant更容易学习和使用。对困惑感到抱歉。 – ComicSansMS 2012-03-05 22:01:47
- 1. 不同的返回类型
- 2. 当返回类型不同
- 3. 不同的返回类型为基类
- 4. 转换器返回不同类型?
- 5. 从C#方法返回不同类型
- 6. Javascript:不同的返回类型
- 7. WCF返回不同类型的数据
- 8. 在Python中返回不同的类型
- 9. 模板不同的返回类型
- 10. 返回不同的列表类型C#
- 11. 从控制器返回不同类型
- 12. 重写与不同的返回类型
- 13. 标准ML:返回不同的类型
- 14. 返回不同的数据类型C#
- 15. ASP.NET Web API的不同返回类型
- 16. information_schema.columns返回不同的数据类型。
- 17. 虚函数的返回类型不同
- 18. spring-ws返回不同类型
- 19. 返回不同类型的方法?
- 20. C++ - 返回不同的变量类型
- 21. 函数Java的不同返回类型
- 22. 返回与参数不同的类型
- 23. 抽象与不同的返回类型
- 24. 不同的Java函数返回类型
- 25. 不同的返回类型在Python
- 26. 函数不能返回具有相同的接口类型为返回类型
- 27. 在scala中返回不同的返回类型
- 28. 尽管返回类型定义不同,函数返回Int
- 29. 单一的方法返回不同的泛型类型的类
- 30. C#泛型/接口 - 根据类返回不同类型
使用多态性,例如,将所有类型包装在一个接口中(当然这只适用于用户定义的类型),或者,你可以声明你的方法返回'Object'类型,但这不是很优雅 – scibuff 2012-03-05 11:53:01
在一些有限的情况下,你可以使用一个'联盟'(提供一些歧视它)。一般来说,多态性更好。 – 2012-03-05 11:54:22
@scibuff:你应该发布这个答案。 – 2012-03-05 11:55:13