2012-10-03 46 views
3

我有一個泛型類。它有2個構造函數。這些在我的組織的代碼庫中被廣泛使用。強制在類定義中重載重載?

class MyClass<T> { 
    MyClass() { ... } 
    MyClass(T defaultValue) { ... } 
} 

我想添加一些功能,但保持向後兼容。所以,我想向大家介紹一個新的布爾可選參數,每個構造函數:

class MyClass<T> { 
    MyClass(bool someFlag = false) { ... } 
    MyClass(T defaultValue, bool someFlag = false) { ... } 
} 

不過,我已經有用途的堆在那裏,其中T是布爾值和默認值傳遞:

class Usage { 
    MyClass<bool> Booly = new MyClass<bool>(false); 
} 

現在,根據過載偏好的規律 - 編譯器將所有這些構造函數的用法與接受someFlag的過載聯繫起來,因爲類型化方法「知道得更好」。儘管在大多數情況下是完美的,但這顯然打破了我的向後兼容性。

我的問題很簡單:是否有可用於我的語言功能覆蓋超載偏好的默認法則,並將舊泛型重載定義爲首選項,以便我不必更改所有這些用法?

當然,這種設計的缺點是,無論何時我想調用第一個過載(只有someFlag參數),我都必須按照C#4規範指定一個命名參數。

其他設計的建議也歡迎,但請嘗試先回答我的問題:)。

+0

_Is沒有一個適合我重載過載preference_的默認法律語言的特點 - @jrummell感謝 – jrummell

+0

號,我懷疑如此。 – tsemer

回答

0

假設你可以有,你可以從每個構造函數調用Initialize()類型的方法,最好的方法是有三個構造函數:

MyClass() { Initialize(null, false); } 
MyClass(T default, bool someFlag = false) { Initialize(default, someFlag); } 
MyClass(bool someFlag) 
{ 
    if (typeof(T) == typeof(bool)) Initialize(someFlag, false); 
    else Initialize(null, someFlag); 
} 

private Initialize(T default, bool someFlag) 
{ 
    // Do whatever 
} 
+0

希望避免類型檢查,但我想這是那裏最可讀的答案。仍然好奇,如果有人提出更清潔的東西.. – tsemer

1

一般情況下?號碼

一個特定的......「解決方法」......在你的情況下可能可以接受?使可選參數a bool?,而不是bool

new MyClass<bool>(false)會打電話給你的defaultValue過載。

new MyClass<bool>(someFlag: false)會調用其他的過載。

也就是說,如果你有任何現有的new MyClass<bool?>(false)調用,這將改變他們他們而不是。

您可以通過專爲使您的標誌不是布爾變量創建一個類克服

public struct FakeBool 
{ 
    private readonly bool val; 
    private FakeBool(bool val) { this.val = val; } 
    public static implicit operator bool(FakeBool f) { return f.val; } 
    public static implicit operator FakeBool(bool f) { return new FakeBool(f); } 
} 

public MyClass(FakeBool someFlag = default(FakeBool)) { ... } 
public MyClass(T defaultValue, FakeBool someFlag = default(FakeBool)) { ... } 

var b2 = new MyClass<bool>(true);   // calls two-argument constructor 
var b1 = new MyClass<bool>(someFlag: true); // calls one-argument constructor 

但這是越來越傻。 (另外,我無法弄清楚如何獲得的真正默認值 - ?任何想法,任何人)

+0

呵呵確定讚揚創造力,但這確實變得愚蠢:)。儘管我想避免類型檢查,但我想我必須與@Bobson的答案一致。謝謝! – tsemer