C#-抽象方法参数,专门为实现它的类设置

C#-抽象方法参数,专门为实现它的类设置,c#,abstract-class,encapsulation,C#,Abstract Class,Encapsulation,我想实现一个类,它为不同的控件存储不同的外观。 起初我想使用泛型,例如: public class Appearance<T where T : Control> { ... } 我现在的问题是,我想实现关于控件类型的封装,每个类都涉及,即: public abstract class Appearance { public abstract void updateAppearanceOf(Control control); } public class TextBoxAp

我想实现一个类,它为不同的控件存储不同的外观。 起初我想使用泛型,例如:

public class Appearance<T where T : Control> { ... }
我现在的问题是,我想实现关于控件类型的封装,每个类都涉及,即:

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
    }
}

这可能吗?

您可以使用类似于
IEnumerable
IEnumerable(T)
的模式

公共界面外观
{
无效更新(控制);
}
公共界面IAppearance:IAppearance
其中TControl:Control
{
无效更新(t控制);
}
公共类文本框外观:IAppearance
{
void iaappearance.Update(控件)
{
var textBox=控件作为textBox;
if(textBox==null)返回;
更新(文本框);
}
公共无效更新(文本框控件)
{
//逻辑
}
}

您可以使用与
IEnumerable
IEnumerable(T)
类似的模式

公共界面外观
{
无效更新(控制);
}
公共界面IAppearance:IAppearance
其中TControl:Control
{
无效更新(t控制);
}
公共类文本框外观:IAppearance
{
void iaappearance.Update(控件)
{
var textBox=控件作为textBox;
if(textBox==null)返回;
更新(文本框);
}
公共无效更新(文本框控件)
{
//逻辑
}
}

您可以使基类显式实现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
    }
}
公共界面外观
{
无效更新(对照);
}
公共抽象类外观:i外观,其中T:Control
{
void iaappearance.updateAppearanceOf(控制)
{
如果(控制为T),则更新((T)控制的外观;
}
公开摘要无效更新(T对照);
}
公共类textbox外观:外观{
公共覆盖void updateAppearanceOf(文本框控件)
{
//实现文本框的更新
}
}

这样,所有实现抽象
外观的类只需担心如何处理它们的控制。

您可以让基类显式实现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
    }
}
公共界面外观
{
无效更新(对照);
}
公共抽象类外观:i外观,其中T:Control
{
void iaappearance.updateAppearanceOf(控制)
{
如果(控制为T),则更新((T)控制的外观;
}
公开摘要无效更新(T对照);
}
公共类textbox外观:外观{
公共覆盖void updateAppearanceOf(文本框控件)
{
//实现文本框的更新
}
}

这样,所有实现抽象
外观的类只需担心如何处理它们的控件。

哪种技术?Winforms、WPF和web对样式/主题的支持程度各不相同。我不完全理解您对通用解决方案的问题,如果您已经解释了为什么不能这样做,请原谅我。但基本上,要像你说的那样保持外观的通用性,然后当你从每个派生的外观继承时(例如,
textbox外观
),你在继承时指定你的T。如果你使用的是WPF,这可能不是正确的方向。哪种技术?Winforms、WPF和web对样式/主题的支持程度各不相同。我不完全理解您对通用解决方案的问题,如果您已经解释了为什么不能这样做,请原谅我。但基本上,要像你说的那样保持外观的通用性,然后当你从每个派生的外观继承时(例如,
TextBoxAppearance
),你在继承时指定你的T。如果你使用的是WPF,这可能不是正确的方向。
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
    }
}