什么是隔离控制依赖关系的“正确”方法

时间:2009-02-27 13:08:49

标签: winforms user-controls controls webforms

在使用之前,我已经制定了继承每个UI控件的个人规则。在以前的生活中,我总是认为这是你可以做的不那么有用的事情之一,因为理由似乎总是“我可能想要立刻改变所有按钮上的字体”......这种动机从未得到回报......曾经......永远。

但最近的两个项目改变了我对这种做法的看法。首先,我们需要一个一致的“ValueChanged”事件,以便我们可以轻松地在表单上实现“脏”标志,而无需在文本框的“TextChanged”事件或ListBox的“SelectedIndexChanged”等之间进行选择。只是希望在所有控件上都能听到一致的内容,并且内置控件的子类化很容易为我们买了。

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

所以这是我的问题:

的相对优势和劣势是什么?
  1. 只需添加一个类,并使其从控件继承。
  2. 添加新的“自定义控件”并继承。
  3. 添加新的“组件”并继承。
  4. 这三个最终都有相同的效果,你会得到一个新类型的Button来放在你的表格上。我已经看到所有三个人都被不同的人使用,每个人似乎都认为他们的方式是最好的。我认为我应该把这个讨论放在StackOverflow上,也许我们可以确定一个共识作为一个社区,哪个是“正确”的方式。

    注意:我已经知道我的个人观点是“正确的”,但我希望看到世界的想法。

2 个答案:

答案 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并添加我需要的控件。这很好,因为:

  • 我从不使用那么多属性,因此传递方法保持在最低限度。
  • 我可以从一种天真的方法开始,然后再进行改进。
  • 应在整个网站上一致地设置外观属性。现在我可以一劳永逸地设置它们。