2011-03-25 71 views
1

語言:C# 主題:擴展控件。如何在不調用基本代碼的情況下擴展用戶控件

我有一個用戶控件B,它有一個字段F,它是一個用於顯示圖像的控件。

我有第二個用戶控件X,它擴展了B.它利用了基本的F,但有它自己的實現(顯示X的特定按鈕等)。

X和B都在單獨的項目中找到,B不是抽象的;這是一個具體的實現。

問題:創建X時,調用第一個B的構造函數,其中它初始化F.調用B的構造函數後,執行它自己的構造函數,其中它將F設置爲其他值。

這不是理想的:
1)F的兩個實例存在,而X應該使用新的F,它似乎在顯示圖像時引用基底F.

解決方法:
1)中的X,取代F I可以配置base.F的前 - 或
2)在B,I可以測試類型:如果類型是X,則跳過F公司初始化。

雖然我可以使用這些解決方法中的任何一種,但有些東西告訴我存在更好的體系結構。但是什麼?

+0

F和F在X和B中的初始化是否不同? – 2011-03-25 15:34:22

+0

是的,更糟糕​​的是,這兩種初始化都具有基類 - 子類關係。我開始認爲,由於可維護性原因,代碼複製可能比重用更好。但我認爲安東破解了它。在別的地方還有其他的init問題,但他們應該解決。 – Wak 2011-03-25 16:10:10

回答

5

嘗試延遲初始化:

public class B 
{ 
    private F f; 

    public F F 
    { 
     get { return f ?? (f = InitializeF()); } 
     set { f = value; } 
    } 

    protected virtual F InitializeF() 
    { 
     return new F(); 
    } 
} 

public class X : B 
{ 
    protected override F InitializeF() 
    { 
     return new SomeOtherF(); 
    } 
} 
+0

我知道必須有一個簡單,優雅的解決方案。謝謝安東! – Wak 2011-03-25 16:03:47

1

會是有意義的,從一個共同的基礎推導出B和X,而不是的B獲得X?如果你發現自己說「我想阻止基類做某事」,那麼也許它不應該來自那個類。

+0

非常好的建議,我會記住的,爲將來。在這種特殊情況下,這只是一個給我一個問題的領域。謝謝! – Wak 2011-03-25 16:00:39

相關問題