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

C# 如何在不调用基代码的情况下扩展用户控件,c#,.net,C#,.net,语言:C 主题:扩展控件 我有一个用户控件B,它有一个字段F,它是一个显示图像的控件 我有第二个用户控件X,它扩展了B。它使用基本F,但有自己的实现,显示按钮等特定于X X和B都存在于不同的项目中,B不是抽象的;这是一项具体的实施 问题是:当X被创建时,首先调用B的contrstructor,它在其中初始化F。调用B的构造函数后,执行它自己的构造函数,它在其中将F设置为其他值 这是不可取的: 1存在两个F实例,当X应该使用新的F时,在显示图像时,它似乎引用了基础F 解决办法: 1英寸X,在更换F

语言:C 主题:扩展控件

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

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

X和B都存在于不同的项目中,B不是抽象的;这是一项具体的实施

问题是:当X被创建时,首先调用B的contrstructor,它在其中初始化F。调用B的构造函数后,执行它自己的构造函数,它在其中将F设置为其他值

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

解决办法: 1英寸X,在更换F之前,我可以处理底座。F-或 2在B中,我可以测试类类型:如果类型是X,那么跳过F的初始化


虽然我可以使用这两种变通方法中的任何一种,但有些东西告诉我存在更好的体系结构。但是什么呢?

尝试惰性初始化:

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();
    }
}

尝试延迟初始化:

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();
    }
}

将B和X从一个公共基中导出,而不是从B中导出X,这有意义吗?如果你发现自己说我想阻止基类做一些事情,那么也许它不应该从该类派生。

从公共基类派生B和X,而不是从B派生X,这有意义吗?如果你发现自己说我想阻止基类做一些事情,那么它可能不应该从该类派生。

在X和B中F的初始化不同吗?是的,更糟糕的是,这两个初始化都有一个基子类关系。我开始认为,出于可维护性的原因,代码复制可能比重用更好。但我认为安东成功了。其他地方还有一些初始化问题,但应该解决。F的初始化在X和B中不同吗?是的,更糟糕的是,这两个初始化都有一个基本的子类关系。我开始认为,出于可维护性的原因,代码复制可能比重用更好。但我认为安东成功了。其他地方还有一些初始问题,但它们应该解决。很好的建议,我会在将来记住的。在这个特殊的例子中,它只是一个单一的字段,给了我一个问题。谢谢很好的建议,以后我会记住的。在这个特殊的例子中,它只是一个单一的字段,给了我一个问题。谢谢我知道必须有一个简单、优雅的解决方案。谢谢安东!我知道必须有一个简单、优雅的解决方案。谢谢安东!