2009-10-07 24 views
1

我想爲我的所有控件和我的表單添加一些自定義功能。我創建了一個類MyControl,並且沒有問題只是在做:.NET:繼承MyControl for Windows.Forms

MyControl : Control 

然後讓我的控件從MyControl繼承。

但是,我希望我的表單具有相同的功能,並且由於Form從ContainerControl,Scrollable Container和THEN Control繼承,所以我將不得不創建我自己的所有這些版本,以使其使用MyControl,這似乎效率低下。

有沒有解決這個辦法嗎?我不能使用的接口,我不希望創建類名爲MyForm的副本具有相同的功能MyControl

回答

2

你在找什麼或者是多重繼承(其中不存在.NET,with no plans to change that),或默認接口實現,又名DII(這可能會在.NET的未來版本中存在)

截至今天,不幸的是沒有乾淨的解決方案來解決這個問題,最好的辦法是創建兩個基類。但是,您可以在第三個助手類中共享代碼,以便只複製膠水代碼,而不是實際的實現。

根據您想要實現的功能,另一種有用的技術是創建一個單獨的類,在其構造函數中傳遞一個對象(Form或Control),並添加所需的額外功能。但是,您將無法以這種方式訪問​​控件/表單保護成員。

Here是一個鏈接,討論您的問題。

+0

謝謝。其實我並不尋找重複的inhertitance,儘管我現在有這個問題我很高興Java/.NET創建者選擇跳過多繼承 – Rolle

+0

@Rolle:我很想知道爲什麼你很高興他們跳過它。如果你有興趣,這裏是他們做的鈦:http://blogs.msdn.com/csharpfaq/archive/2004/03/07/85562.aspx – Brann

+0

我曾經有一個非常真實的與「鑽石問題」相遇,在一個更大的C++項目中,這迫使我們在後期重寫很多代碼。一般來說,我認爲在某種程度上,如果你從一開始就不太瞭解你的應用程序的外觀,那麼你的大腦在做MI時肯定會受到傷害,而且我發現你通常不會。 – Rolle

0

我認爲這樣做是

MyForm : Form

的唯一途徑

也許使用接口和擴展方法儘可能地減少代碼重複。

0

如果您只想添加額外的方法,您可以創建擴展方法,這些擴展方法似乎是某個對象的一部分,但卻不是。

你可以聲明一個這樣的:

void MyMethod(this Control obj, string foobar); 

然後,您可以調用此方法來控制類的任何其他方法:

myButton.MyMethod("baz"); 

但是,如果你希望覆蓋虛方法,與班級內部的人員一起玩,等等,那麼我可以幫助你的東西並不多。

1

由於不支持多重繼承,因此您沒有多少選擇。

  1. 使用擴展在MyForm的你MyControl做了什麼控制

  2. 重新實現方法。

For 2。您可以創建一個接口,如IMyControl,以及一個實現它的幫助器類,如MyHelperControl : IMyControl。然後在MyControlMyForm執行IMyControl,但使用私有MyHelperControl並映射所有接口成員調用這個助手,這樣你只有一個真正的代碼來管理。

interface IMyControl { 
    void A(); 
} 

class MyHelperControl : IMyControl { 
    void A() { 
     // your implementation here 
    } 
} 

class MyControl : Control, IMyControl { 
    private MyHelperControl _myHelper; 
    void A() { 
     _myHelper.A(); 
    } 
} 

class MyForm : Form, IMyControl { 
    private MyHelperControl _myHelper; 
    void A() { 
     _myHelper.A(); 
    } 
} 
+0

問題說他不能使用接口,儘管我沒有看到爲什麼他不能? – MusiGenesis

+0

也許「不能」是因爲一個接口會重複代碼嗎?這就是爲什麼我理解了。 –

1

一兩件事你可以做的是讓你的形式從包含MyControl的實例定製的「主」的形式繼承,像這樣:

public partial class MasterForm : Form 
{ 
    private MyControl _MyControl = new MyControl(); 

    public MasterForm() 
    { 
     InitializeComponent(); 
    } 

    public void Method1() 
    { 
     _MyControl.Method1(); 
    } 
} 

這意味着複製所有MyControl的方法簽名在MasterForm中(或者至少在你的表單中需要的),但至少方法代碼本身不會被複制。

public partial class Form1 : MasterForm 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Method1(); 
    } 
} 

這種方法避免了使用的接口,雖然我很好奇,爲什麼正是你不能這裏使用的接口。

+0

@MusicGenesis:我認爲OP可以使用一個inter面對,但確實想避免代碼重複。 – Brann

+0

@Brann:好吧,他確實說過「我不能使用界面」。 – MusiGenesis

+0

我的意思是MyControl不能只是一個接口,因爲它需要實現一些代碼。感謝所有的答案! – Rolle