如何在不调用基本代码的情况下扩展用户控件

时间:2011-03-25 15:30:11

标签: c# .net

语言:C# 主题:扩展控件。

我有一个用户控件B,它有一个字段F,它是一个显示图像的控件。

我有第二个用户控件X,它扩展了B.它使用了基础F,但它有自己的实现(显示特定于X的按钮等)。

X和B都在不同的项目中找到,B不是抽象的;这是一个具体的实施。

问题:当创建X时,调用第一个B的构造函数,其中它初始化F.在调用B的构造函数之后,然后执行它自己的构造函数,其中它将F设置为其他东西。

这是不可取的:
1)F的两个实例存在,而X应该使用新的F,它似乎在显示图像时引用基数F.

解决方法:
1)在X中,在更换F之前我可以处理base.F - 或
2)在B中,我可以测试类类型:如果type是X,则跳过F的初始化。

虽然我可以使用这些解决方法中的任何一种,但有些东西告诉我存在更好的架构。但是什么?

2 个答案:

答案 0 :(得分: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();
    }
}

答案 1 :(得分:1)

从公共基础派生B和X,而不是从B派生X是否有意义?如果你发现自己说“我想阻止基类做某事”,那么也许它不应该来自那个类。