我想实现一个为不同控件存储不同外观的类。 起初我认为使用泛型,因此:
public class Appearance<T where T : Control> { ... }
但有两个问题。首先,我想在列表中使用这些外观用于不同的控件,即不同的T(在这种情况下不可能)。其次,每个控件类型的外观将根据其引用的控件具有不同的属性。所以解决方案是每个控件类型的基类(最好是抽象的)和派生类:
abstract class Appearance { ... }
public class TextBoxAppearance : Appearance { ... }
public class ComboBoxAppearance : Appearance { ... }
我现在的问题是我想实现关于控件类型的封装,每个类关注点,即:
public abstract class Appearance {
public abstract void updateAppearanceOf(Control control);
}
public class TextBoxAppearance : Appearance {
public void updateAppearanceOf([here I want to give TextBox instead of Control])
{
// implement update of TextBox
}
}
public class ComboBoxAppearance : Appearance {
public void updateAppearanceOf([here I want to give ComboBox instead of Control])
{
// implement update of ComboBox
}
}
这可能吗?
答案 0 :(得分:3)
您可以使用与IEnumerable
,IEnumerable(T)
类似的模式。
public interface IAppearance
{
void Update(Control control);
}
public interface IAppearance<in TControl> : IAppearance
where TControl : Control
{
void Update(TControl control);
}
public class TextBoxAppearance : IAppearance<TextBox>
{
void IAppearance.Update(Control control)
{
var textBox = control as TextBox;
if(textBox == null) return;
this.Update(textBox);
}
public void Update(TextBox control)
{
// Logic
}
}
答案 1 :(得分:1)
您可以使您的基类明确实现IAppearance
public interface IAppearance
{
void updateAppearanceOf(Control control);
}
public abstract class Appearance<T> : IAppearance where T : Control
{
void IAppearance.updateAppearanceOf(Control control)
{
if (control is T) updateAppearanceOf((T)control);
}
public abstract void updateAppearanceOf(T control);
}
public class TextBoxAppearance : Appearance<TextBox> {
public override void updateAppearanceOf(TextBox control)
{
// implement update of TextBox
}
}
这样实现抽象Appearance
的所有类只需要担心如何处理它们的控制。