我怎樣才能(在運行時)決定從我的函數返回哪種類型?
這可能嗎?
我認爲這是一個不能確定的問題。返回不同類型
返回不同類型
回答
使用多態性
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. 函數Java的不同返回類型
- 2. 不同的Java函數返回類型
- 3. WCF返回不同類型的數據
- 4. 轉換器返回不同類型?
- 5. 從C#方法返回不同類型
- 6. 抽象與不同的返回類型
- 7. 虛函數的返回類型不同
- 8. 標準ML:返回不同的類型
- 9. 返回與參數不同的類型
- 10. 不同的返回類型在Python
- 11. ASP.NET Web API的不同返回類型
- 12. Javascript:不同的返回類型
- 13. information_schema.columns返回不同的數據類型。
- 14. 返回不同的列表類型C#
- 15. 在scala中返回不同的返回類型
- 16. 儘管返回類型定義不同,函數返回Int
- 17. 相同的功能,不同的返回類型的類層次
- 18. 'file_contents()'不返回類型GLchar
- 19. 返回類型
- 20. 返回類型
- 21. 一個泛型類型參數,返回類型不同的泛型?
- 22. 返回不同類型的ViewModel回到控制器
- 23. 使用Optional.map.orElse返回不同的泛型類型
- 24. 基於enum輸入返回不同類型的泛型函數
- 25. 具有相同基本結構的不同返回類型
- 26. 從Java界面中的相同方法返回不同類型
- 27. 的Java覆蓋衝突 - 與不同的返回類型同名
- 28. actionscript中的泛型(返回類型與參數類型相同)
- 29. 模擬框架返回類不同的名稱和類型
- 30. `getOrElse`停止進程或返回不同的類類型
使用多態性,例如,將所有類型包裝在一個接口中(當然這隻適用於用戶定義的類型),或者,你可以聲明你的方法返回'Object'類型,但這不是很優雅 – scibuff 2012-03-05 11:53:01
在一些有限的情況下,你可以使用一個'聯盟'(提供一些歧視它)。一般來說,多態性更好。 – 2012-03-05 11:54:22
@scibuff:你應該發佈這個答案。 – 2012-03-05 11:55:13