日期:2014-05-19  浏览次数:21038 次

我想写个TextBox和ComboBox共同继承的基类,请问能实现吗?如何实现?给个思路?
我的业务中有许多控件有相同的逻辑,
比如:大部分TextBox和ComboBox都需要根据能否为空设置它的背景色为浅蓝;
还有,如果此控件不能为空,失去焦点时它的背景色也会根据控件内容是否为空改变,不为空则设置默认背景色,为空则显示为黄色背景色提示用户。
还有比较多的其他这方面的逻辑。
我目前的做法是单独写两个基类,一个基类命名为TextBoxEx,它继承自TextBox,然后重写了一些方法和属性等,代码中所有要用到TextBox的地都承自这个基类TextBoxEx,另一个CombBoxEx也按照相似的方法继承重写ComboBox类,所有CombBox都继承这个基类。
但这样的缺点就是大部分代码要写两遍,不但不利于重用,也不利于扩展。
而且如果以后要将这些特性加到其他控件上,又要新建一个基类,将这些代码COPY过去,太不利于扩展。

我的目的是:只用在一个地方写一遍这种代码,就能让所有的TextBox和ComboBox继承。

但我现在还没找到有什么方法能够同时继承自TextBox和ComboBox两个基类(这样是不可能的吧?)
更没有办法自已新写一个基类同时具有TextBox和ComboBox的特性,因为C#不支持多继承,接口也不是用在这方面吧?
请问我的问题有什么好的解决办法?

------解决方案--------------------
接口可以多继承,但是接口满足不了你的需求。

建议,继承比较接近的一个基类,剩余部分只能自己去写了。个人看法,保留;

==================================================================
博客空间:http://blog.csdn.net/lovingkiss
资源下载:http://download.csdn.net/user/lovingkiss
Email:loving-kiss@163.com
本人说明: <我的帖子我做主,结贴率保持100%>
优惠接单开发,信誉保证,Q64180940(请清楚注明业务还是技术咨询)
==================================================================
------解决方案--------------------
另外一个办法,制作一个组件,这个组件可以为其它控件提供两个属性为空的背景色,不为空的背景色和一个扩展属性,指定控件是否应用自定义的背景色(类似于tolltip控件提供的扩展属性),.在设计界面时对有相应的控件进行设置,这个方法的好处是无需对基本控件进行扩展,同时可应用于大多数控件.
------解决方案--------------------
赞一下Bote_China(), 稍为修改一下你的code:

[ProvideProperty( "ActiveEnabled ", typeof(Control))]
public class Activetor : System.ComponentModel.Component, System.ComponentModel.IExtenderProvider
{
protected Color nullColor;
protected Color defaultColor;

protected Dictionary <Control, bool> controls;

protected System.ComponentModel.Container components;

public Activetor()
{
InitializeComponent();
}

protected void InitializeComponent()
{
this.components = new Container();
this.nullColor = Color.LightYellow;
this.defaultColor = Color.White;
this.controls = new Dictionary <Control, bool> ();
}

[Browsable(true)]
public Color NullColor
{
get { return nullColor; }
set { nullColor = value; }
}

[Browsable(true)]
public Color DefaultColor
{
get { return defaultColor; }
set { defaultColor = value; }
}

#region IExtenderProvider Members

bool IExtenderProvider.CanExtend(object extendee)
{
if ((extendee is Control) && !(extendee is Activetor))
return true;
return false;
}

#endregion

[DefaultValue(false)]
public bool GetActiveEnabled(Control ctrl)
{
if (controls.ContainsKey(ctrl))
return controls[ctrl];
else
return false;
}

public void SetActiveEnabled(Control ctrl, bool value)
{
if (value)
{
controls[ctrl] = value;
ctrl.TextChanged += new EventHandler(OnTextChanged);
OnTextChanged(ctrl, new EventArgs());
}
else
{
controls.Remove(ctrl);
ctrl.TextChanged -= new EventHandler(OnTextChanged);