强制派生类实现接口

时间:2015-04-28 11:15:49

标签: c# generics inheritance interface enums

我今天在这里(就像昨天一样)有另一个奇怪的界面问题。

我有一个班级:

public class InputDevice<T> where T : Button {

    protected List<T> buttons = new List<T>();

    protected InputDevice() {
        //Only allow instanciation from within a derived class
    }
}

如您所见,此类无法实例化。
从中派生的类可能能够实例化。

这是一个子类:

public sealed class Keyboard : InputDevice<KeyboardButton> {

    public Keyboard() {
        buttons.Add(new KeyboardButton(KeyCode.A));
    }
}

到目前为止一切顺利 现在,我希望InputDevice<T>的所有派生词都提供GetButton()方法 该方法应该将设备按钮的枚举类型作为参数。

对于Keyboard类,它看起来像这样:

public KeyBoardButton GetButton(KeyCode Code) {
    //Retrieve button
}

对于Mouse : InputDevice<MouseButton>,它看起来像是:

public MouseButton GetButton(MouseButtons Button) {
    //Retrieve button
}

注意:MouseButton (class) != MouseButtons (enum)

每个InputDevice(T)的派生者都必须实施该方法 但我不希望InputDevice(T)本身实现它,因为它不知道按钮的枚举类型(f.e.KeyCode)。
它只知道按钮的类型,即T.

  1. 解决方案
  2. 将以下界面添加到InputDevice(T)

    public interface IInputDevice{
        void GetButton(System.Type);
    }
    
    • 问题:

    InputDevice(T)必须实施它,但它不能实现它 我不知道T

    的返回类型InputDevice(T)
    1. 解决方案:
    2. 在所有派生程序中手动添加方法。

      • 问题:

      不保证派遣人员提供方法。

      你有解决方案吗?我试图解决这个问题时感到很困惑。

2 个答案:

答案 0 :(得分:7)

您可以使基类抽象并更改其定义以包含密钥代码类型:

public abstract class InputDevice<TButton, TEnum> where TButton : Button {
    public abstract TButton GetButton(TEnum Code);
}

然后你可以像这样定义派生类:

public sealed class Keyboard : InputDevice<KeyboardButton, KeyCode> {
    public override KeyboardButton GetButton(KeyCode Code) {
        // implementation here...
    }
}

答案 1 :(得分:0)

只需声明InputDevice<T>摘要

即可
public abstract class InputDevice<T>
{
    protected abstract void GetButton(System.Type type);
}

此外,您可以将InputDevice<T>设置为IInputDevice的继承者,这也可以。