2009-02-27 75 views
1

我已经使它成为一个个人规则,在使用它之前继承每个UI控件。在以前的生活中,我总是认为这是你可以做的不太有用的事情之一,因为理由总是好像是“我可能想要一次改变所有按钮上的字体”......这是一种永不成功的动机......曾经......曾经。但是,最近的两个项目已经改变了我对这种做法的看法。首先,我们需要一个一致的“ValueChanged”事件,以便我们可以轻松地在表单上实施“脏”标志,而无需大量的switch语句在Textbox的“TextChanged”事件或ListBox的“SelectedIndexChanged”之间进行选择。只是想要一个一致的东西来倾听所有控件,并且对内置控件进行子类化很容易就能买到我们。什么是“正确”的方式来隔离控制依赖

在第二个项目中,我们尽了一切努力与基本控件相处,因为UI预计会非常简单,但是几个月后,显然他们不会再削减它了,我们购买了Telerik控制套件。如果我们继承了所有的控件,那么将我们的派生控件更改为从Telerik控件继承将会为我们全局应用这些更改。相反,我们必须在所有的表单设计师中进行一些搜索和替换。

因此,这里是我的问题:什么是相对的优势和

  1. 弱点简单地增加一个类,并使其从控件继承。
  2. 添加一个新的“自定义控件”并继承。
  3. 添加一个新的“组件”并继承。

这三者最后都有相同的效果,你会得到一个新的Button类型放在你的表格上。我看到所有三个人都被不同的人使用,每个人似乎都认为他们的方式是最好的。我想我应该把这个讨论放在StackOverflow上,也许我们可以确定一个共识,就是哪一个是“正确”的方式。

注:我已经有我的个人意见,哪些是“正确”,但我想看看世界的想法。

回答

1

如果两个& 2都继承,那么它们在功能上是相同的,不是吗?如果其中一个是封装一个控件?在这种情况下,你有很多pass-thru成员要添加。我不会推荐它。如果没有很好的理由,我简直不会添加额外的继承......例如,“改变的事件”可能已经被一些重载等处理过了。在C#3.0中,由于扩展方法 - 即你可以拥有的东西,如:

public static AddChangeHandler(
     this TextBox textbox, EventHandler handler) { 
    testbox.TextChanged += handler; 
} 
public static AddChangeHandler(
     this SomethingElse control, EventHandler handler) { 
    control.Whatever += handler; 
} 

,只是使用myControl.AddChangeHandler(handler);(依靠静态类型的myControl来解决相应的扩展方法)。

当然,你可以退后一步,听听你自己的事件模型,而不是UI - 让UI以基本方式更新模型,并在你自己的对象模型中有逻辑与控件无关)。

+0

在我们的例子中,我们使用的是被动视图MVP模型,所以在模型层面上的倾听不适合我们。上面的例子被简化,只是为了设置问题本身。 1和2在功能上是相同的,但是由于设计器文件而在结构上不同。 – Mel 2009-02-27 13:24:44

0

我使用组合。我只需创建一个新的UserControl并添加我需要的控件。这工作正常,因为:

  • 无论如何,我从来没有使用这么多的属性,所以传递方法保持在最低限度。
  • 我可以从幼稚的方法入手,稍后再细化。
  • 外观和感觉的属性应该在整个网站中保持一致。现在我可以一劳永逸地设置它们。
相关问题