2010-12-13 31 views
3

我有一類,其中我從Control鑄造System.Windows.Forms.Label到一個自定義類型

導出
[Serializable] 
public class CommonControl : System.Windows.Forms.Control,IXmlSerializable 
{ 

基本上這類增加了一些更多的屬性到默認控件類。 我的問題是我不能將Control對象轉換到我的自定義控件對象中。由於自定義控件類派生自控件,我認爲它可能工作。

我正在做這樣的鑄造。

CommonControl ctrlTemp = new CommonControl(); 
ctrlTemp = (CommonControl)((Control)ctrl); 

這裏CTRL是一個標籤對象。當我調試第一個鑄造工作正常。 (Control)ctrl部分。但是當(CommonControl)((Control)ctrl)被調試時,它會顯示以下消息。

(CommonControl)(CTRL)無法投 'CTRL'(其具有實際類型 'System.Windows.Forms.Label')至 'SharpFormEditorDemo.CommonControl' SharpFormEditorDemo.CommonControl

回答

6

你不能跨類繼承。 LabelCommonControl都從Control繼承,但是是不同的兄弟類,因此您不能將其中一個投向另一個,甚至不能通過其父代。或者更簡單地說:一旦你創建了一個Label對象,即使你將它作爲Control使用它,它總是一個Label對象。通過將其轉換爲CommonControl,您完全改變了它的類型,這在C#中是非法的。

也沒有多重繼承。作爲一種解決方法,您可以創建一個接口,然後創建需要使用的控件的子類,以實現您的自定義接口。一個快速和骯髒例如:

public interface ICommonControl : System.Xml.Serialization.IXmlSerializable { 
    // ... 
} 

[Serializable] 
public class MyLabel : System.Windows.Forms.Label, ICommonControl { 
    // Implement your common control interface and serializable methods here 
} 

然後創建ctrl作爲MyLabel對象。它繼承自Label並採用您的類定義的所有接口方法。如果你需要施放它,將它投射到ICommonControl

是的,你需要繼承每個控件類,但這只是我能想到的一個解決方案。

+0

Thnx很多。我應該考慮班級的層次結構。 – JCTLK 2010-12-13 06:10:40

1

哦,上帝,你知道你在做什麼嗎? ctrl是Label,絕對不是CommonControl和Control之間的層次關係。 您應該將ctrl類型更改爲CommonControl和Control層次結構之間的用戶定義類型,然後才能工作。

將控件ctrl控制絕對沒問題,因爲標籤派生自Control。然而,鑄造ctrl到CommonControl是絕對錯誤的,因爲ctrl決不與CommonControl有任何關係

你可以做的是創建一個派生自Label的類,並使ctrl創建該類的一個對象。那個班正在實施你想要的界面。

+0

「哦,上帝,你知道你在做什麼嗎?」 - 沒有必要! – 2010-12-13 06:04:08

+0

@geoff - 豎起大拇指:)即使我重視所有的答案。順便說一句,這是我做過的有點愚蠢的事情......:D Thnx everyone。 – JCTLK 2010-12-13 06:09:40

+0

對不起,我很抱歉...但實際上你可以在C#中選擇1或2本關於面向對象編程的書籍,希望它能幫助你理解爲什麼OO和幫助你設計你的程序。基本上在你的情況下,你也可以創建一個接受任何控制對象的類,然後使用is運算符檢查實際類型,並基於該序列化...再次抱歉... – 2010-12-13 06:30:22