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

Wak*_*Wak 1 .net c#

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

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

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

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

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

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

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

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

Ant*_*lev 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();
    }
}
Run Code Online (Sandbox Code Playgroud)