2009-09-02 78 views
0

我有一個封裝所有功能的表單,但是可以與具體的類型T1一起使用。 現在我想創建具有差異的相同表單,它將使用另一個類型T2不同類型的C#WinForm?

T1和T2不會繼承任何東西,所以我不能繼承。

我怎麼能這樣做,而不是一遍又一遍地複製整個代碼?

我正在考慮創建一個通用表單,但我不認爲這是一個正確的解決方案。

任何想法?

回答

0

你對錶格中的T1和T2做什麼?如果您想以強類型的方式公開/接受值,泛型聽起來就像是正確的方法 - 儘管對於WinForms設計器IIRC它可能會非常棘手。

換句話說:如果你不使用WinForms,你會接觸到泛型嗎?

+0

是,如果我沒有使用的WinForms我會使用仿製藥,因爲代碼不會對所有類型相同.. –

+0

在這種情況下,我想看看在這種情況下使用泛型了。唯一的缺點是設計師的支持......您可能需要創建一個具有特定類型參數的表單的子類才能讓設計師工作。 –

1

寫T2,複製所有的代碼,並確保封裝所有的差異在單獨的方法。然後創建一個新的基類並從兩者移動通用代碼。在有兩個需要它的類之後,代碼共享設計變得更加明顯(包括是否應該使用泛型),而不是提前計劃。

+0

問題是所有這些方法都是常見的。這意味着後代類內部沒有任何東西。這就是爲什麼我有一種感覺,它傾向於泛型。 –

0

我使用通用元素來封裝我的對象,它有一個文本值和一個標記值,它允許你想要做的事情,一個很好的用途是添加到組合框。也許你可以在你的表格中加入類似這樣的東西?

public class GenericElement<T> { 
    public GenericElement(string text) { 
     this.Text = text; 
    } 
    public GenericElement(string text, T tag) : this(text) { 
     this.Tag = tag; 
    } 
    public T Tag { 
     get; set; 
    } 
    public string Text { 
     get; set; 
    } 
    public override string ToString() { 
     return Text; 
    } 
} 

// Combo-Box example 
public class MyForm : Form { 
    private void DoLoad(object sender, EventArgs e) { 
     comboNum.Items.Add(new GenericElement<int>("One", 1); 
     comboNum.Items.Add(new GenericElement<int>("Two", 2); 
     comboNum.Items.Add(new GenericElement<int>("Three", 3); 
    } 
    public int SelectedNumber { 
     get { 
      GenericElement<int> el = 
       comboNum.SelectedItem as GenericElement<int>; 
      return el == null ? 0 : el.Tag; 
     } 
    } 
}