我已经从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
?
答案 0 :(得分:4)
您必须手动重新创建要从Ctrl
继承的每个控件。 e.g。
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 */
现在,您保留每个控件的大部分原始功能,保留其继承,并以最小的努力(或更改原始控件)在一个位置扩展功能。
答案 1 :(得分:1)
除非您重做所需的所有课程,否则您无法执行此操作,例如:
public class ExtendedTextBox : Ctrl
{
//implement the thing here
}