2010-02-22 38 views
3

我正在解析一個http GET查詢字符串到它的組件中。爲了使它成爲模塊化(參數的數量和類型可能會有很大的差別),我希望有一個Parameter抽象基類或接口來定義屬性是否已設置,還有一個Set方法用於設置值。有沒有辦法做到這一點與Set方法的可變參數類型?我可以在C#中創建接口或抽象類來聲明具有未知類型參數的方法嗎?

的總體思路是:然後

public abstract class Parameter 
{ 
    public bool IsSet { get; protected set; } 
    protected Parameter() { IsSet = false; } 
    public abstract void Set(--unknown type here--); 
} 

樣本參數孩子會是這樣的:

public class IntParameter : Parameter 
{ 
    public int Value { get; protected set; } 
    public void Set(int value) 
    { 
     Value = value; 
     IsSet = true; 
    } 
} 

採用這種結構的話,我可以折騰每個查詢參數到其相應的強類型的類,但仍然確保所有這些類都是一致的。 IsSet屬性的原因是能夠檢查參數是否已設置,因爲某些參數沒有任何「安全」值,我知道它們確實沒有被有意傳遞。如果沒有設置一個值,那麼它會得到一個默認值。

考慮到這個問題,我懷疑它可以被處理,因爲我想實現它,但是這個例子應該讓我能夠理解我想要做什麼。

有沒有關於如何最好地處理它的任何建議。如果有一個方便的設計模式或常見的做法,我不會感到驚訝,但我還沒有設法Google。

我看到了手的選項有:

  • 不要使用繼承和依靠,而不是慣例的一致性。我很可能不需要通過列表迭代或其他方式來處理這些問題,但如果我找到了解決方法,它可能會帶來一些新的想法或機會。
  • 使用一個對象參數,然後以某種方式做一些typeof()和切換魔法,儘管這會讓我覺得非常醜陋,並且非多態,可以這麼說。

還有其他想法嗎? :)

+0

你可以使用泛型 – Natrium 2010-02-22 13:07:13

+0

是啊,我應該已經意識到。沒有立即注意到您的評論。下面的答案說得很清楚。 :) – McMuttons 2010-02-22 13:38:27

回答

10

你也許在尋找這樣的事情

public abstract class Parameter<T> 
{ 
    public bool IsSet { get; protected set; } 
    protected Parameter() { IsSet = false; } 
    public abstract void Set(T value); 
    public T Value; 
} 
public class IntParameter : Parameter<int> 
{ 
    public override void Set(int value) 
    { 
     Value = value; 
     IsSet = true; 
    } 
} 

看一看An Introduction to C# Generics

+0

該死,更快。 :) +1 – 2010-02-22 13:08:24

+0

男人,問一個愚蠢的問題......這正是我需要的。泛型應該是我想到的第一件事。 :) 非常感謝你! – McMuttons 2010-02-22 13:12:18

+0

就像一個額外的評論,對於泛型,我甚至不需要繼承,但可以只用一個類來完成,這更好。 :) – McMuttons 2010-02-22 14:16:34

相關問題