语言: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的初始化。
虽然我可以使用这些解决方法中的任何一种,但有些东西告诉我存在更好的架构。但是什么?
答案 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是否有意义?如果你发现自己说“我想阻止基类做某事”,那么也许它不应该来自那个类。