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