C#OOP概念:是从Control类继承的正确方法吗?

时间:2014-06-19 11:42:36

标签: c# winforms oop inheritance

我的问题是关于正确的代码编写方式。我使用C#Winforms。 我创建了一个Control类的实例(设计者可用的任何人),例如Panel类,设置了这个对象的一些属性,订阅了事件,编写了事件处理程序等等。但通常我通过下一个方式做到这一点:我创建我的CustomPanel类继承来自Panel和白色上面的代码(设置属性,订阅事件,事件处理程序)在CustomPanel类中。因此,当我想使用Panel设置和功能时,我可以从设计器中拖放CustomPanel对象。这是一种正确的方式,还是来自Control类的干扰不是一个好主意?也许我应该创建自己的类(不继承)包含Panel设置并将其绑定到Panel?

3 个答案:

答案 0 :(得分:0)

在做出决定时,我会依赖Liskov Substitution Principle。如果你在精神上做了什么,那么继承是可以的(我觉得没关系)。

答案 1 :(得分:0)

在Windows窗体中,修改控件的功能非常有限(您可以尝试WPF更多方法来实现此类修改。)

1)在WinForms中,你通常会以大量的事件处理程序结束:

winFormsControl.OnSomethingChanged += new delegate(object sender, SomeEventArgs e)
    {
        WinFormsControl control = (WinFormsControl)sender;

        control.Property = value;
        // ...
    };

winFormsControl.OnSomethingOtherHappened += this.Handle_WinFormsControl_OnSomethingOtherHappened;

2)或构建自己的派生类,如果你必须添加很多属性和事件或某些方法来覆盖如下:

public class MyCustomPanel : Panel
{
    //Constructor
    public MyCustomPanel()
    {
        base.Layout += this.OnBaseLayout;
        ...
    }

    // Overriden methods(i am not sure if there could be any)
    public override void SomeVirtualMethod() {...}

    // Custom members
    public CustomLayoutMode LayoutMode { get; set;}

    public event EventHandler CustomLayoutCompleted;
}

3)创建自己的UserControl派生类也是一个选项。

4)您还可以尝试将现有控件包装在直接从Control中导出的自定义控件中:

public MyCustomControl : Control
{
    private Panel WrappedPanel;

    public MyCustomControl()
    ...
}

但是我对你如何在你的包装器内绘画的方式有点不确定(但它可能是可能的,只是我的WinForms生锈了)。

尽管如此,大多数考虑的场景都是不理想的 - 通常我们需要Panel的原始属性和事件在Control的界面中,没有人喜欢样板代码。

避免此类问题的最简单方法是继承。没有人说这是最好的。特别是当您必须将自定义控件的一些硬编码行为合并为一个。

答案 2 :(得分:0)

尽可能使用装饰器

对Windows窗体设计器使用Visual继承是非常非常错误的,很多时候设计师无法工作,而且当控件处于64位汇编时,从不可以工作 http://support.microsoft.com/kb/967050