如何使所有新控件继承新的扩展控件
本文关键字:控件 继承 扩展 何使所 新控件 | 更新日期: 2023-09-27 18:24:42
我从Control
扩展而来,如下所示:
public class Ctrl : Control
{
public Boolean HasBorder { get; set; }
public Boolean ShouldDrawBorder { get; set; }
protected override void OnPaint(PaintEventArgs e)
{
if(CertainConditionIsMet)
{
// Then draw the border(s).
if(this.BorderType == BorderTypes.LeftRight)
{
// Draw left and right borders around this Ctrl.
}
}
base.OnPaint(e);
}
}
但是,当我将new TextBox();
添加到Form
时,它仍然继承自Control,而不是继承自Ctrl
。如何使所有新控件从Ctrl
继承?
您必须手动重新创建要从Ctrl
继承的每个控件。例如
public class TextBoxCtrl : Ctrl
{
/* implementation */
}
编辑:
为了避免不得不重新发明轮子,我可能会用以下方式来处理它:
首先,将添加的属性作为接口的一部分,这样它就更像是一个可以移交的控件:
public interface ICtrl
{
Boolean HasBorder { get; set; }
Boolean ShouldDrawBorder { get; set; }
}
接下来,(在一个单独的类中)制定一个助手方法来处理UI增强:
public static class CtrlHelper
{
public static void HandleUI(Control control, PaintEventArgs e)
{
// gain access to new properties
ICtrl ctrl = control as ICtrl;
if (ctrl != null)
{
// perform the checks necessary and add the new UI changes
}
}
}
接下来,将此实现应用于您想要自定义的每个控件:
public class TextBoxCtrl : ICtrl, TextBox
{
#region ICtrl
public Boolean HasBorder { get; set; }
public Boolean ShouldDrawBorder { get; set; }
#endregion
protected override void OnPaint(PaintEventArgs e)
{
CtrlHelper.HandleUI(this, e);
base.OnPaint(e);
}
}
/* other controls */
现在,您可以保留每个控件的大部分原始功能,保留其继承,并在一个位置以最小的工作量扩展功能(或更改原始控件)。
除非您重做所有需要的类,否则您无法做到这一点,例如:
public class ExtendedTextBox : Ctrl
{
//implement the thing here
}