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

时间:2013-11-11 17:27:58

标签: c# abstract-class encapsulation

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

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

这可能吗?

2 个答案:

答案 0 :(得分:3)

您可以使用与IEnumerableIEnumerable(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的所有类只需要担心如何处理它们的控制。