在使用之前,我已经制定了继承每个UI控件的个人规则。在以前的生活中,我总是认为这是你可以做的不那么有用的事情之一,因为理由似乎总是“我可能想要立刻改变所有按钮上的字体”......这种动机从未得到回报......曾经......永远。
但最近的两个项目改变了我对这种做法的看法。首先,我们需要一个一致的“ValueChanged”事件,以便我们可以轻松地在表单上实现“脏”标志,而无需在文本框的“TextChanged”事件或ListBox的“SelectedIndexChanged”等之间进行选择。只是希望在所有控件上都能听到一致的内容,并且内置控件的子类化很容易为我们买了。
在第二个项目中,我们尽一切努力使用基本控件,因为预计用户界面非常简单,但几个月之后,很明显他们不会再削减它了,我们购买了Telerik控制套件。如果我们继承了所有控件,那么将我们的派生控件更改为继承Telerik控件将全局应用这些更改。相反,我们必须在所有表单设计者中进行一些搜索和替换。
所以这是我的问题:
的相对优势和劣势是什么?这三个最终都有相同的效果,你会得到一个新类型的Button来放在你的表格上。我已经看到所有三个人都被不同的人使用,每个人似乎都认为他们的方式是最好的。我认为我应该把这个讨论放在StackOverflow上,也许我们可以确定一个共识作为一个社区,哪个是“正确”的方式。
注意:我已经知道我的个人观点是“正确的”,但我希望看到世界的想法。
答案 0 :(得分:1)
如果1和1都是2是继承,那么它们在功能上是相同的,不是吗?其中一个是否应该封装一个控件?在这种情况下,您需要添加许多pass-thru成员。我不推荐它。
Peronally,我根本不会在没有充分理由的情况下添加额外的继承...例如,“更改的事件”可能已经处理了一些重载等。使用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以基本方式更新模型,并在您自己的对象中拥有逻辑模型(与控件无关)。
答案 1 :(得分:0)
我使用作文。我只是创建一个新的UserControl并添加我需要的控件。这很好,因为: