所以,請考慮以下情況發送實際的對象類型重載函數
我有一個超類類型的「形狀」和類「盒子」,「圓」和「箭」繼承形狀。我有其他地方的形狀列表,可以包含任何這些類型的成員。我需要列舉整個列表並繪出每個形狀。的問題是,每個形狀繪製不同的,因此我有:
void Draw(Box b) {}
void Draw(Square s) {}
void Draw(Circle c) {}
的問題是,當我通過列表枚舉,每個元件返回的類型爲形狀的(因爲該列表類型形狀的),即使盡管它的實際類型可能是Box。由於這個原因,沒有一個過載被認爲是正確的。
想到我有一個想法是創建一個臨時對象,並聲明它的實際類型的列表元素。所以,讓我們假設列表[i]是該型圈
object o = Type.GetType(Convert.ToString(list[i].GetType()));
o = list[i];
,但是這仍然因爲現在編譯器識別「O」的類型爲對象,而不是圈不工作!
我該如何解決這個問題?
+1。或者使用一個接口,比如'IDrawable',並且可以繪製子類來實現這個接口。 –
這是我的第二個想法,它肯定會工作。我的寵物與此有關的是,我創建的任何控件都必須傳遞給pictureBox的引用來繪製。我希望能有辦法擺脫它。 – Rishi
將PictureBox概括爲一個'IDrawingSurface'接口,至少你不會依賴於特定的繪圖技術。您也可以將該接口傳遞給形狀的構造函數,以便它不需要在每個「Draw」調用中傳遞。由其他形狀組成的形狀可以將它自己的'IDrawingSurface'引用傳遞給組件形狀,比如說「繪製到我繪製的相同位置」。 –