gpt4 book ai didi

c# - 强制派生类实现接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 22:58:22 25 4
gpt4 key购买 nike

我今天(和昨天一样)在这里遇到另一个奇怪的界面问题。

我有一个类:

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)自己来实现它,因为它不知道按钮的枚举类型(例如 KeyCode)。
它只知道按钮的类型,即T。

  1. 解决方案

将以下接口(interface)添加到InputDevice(T)

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

InputDevice(T ) 必须实现它,而它不能。
我不知道返回类型TInputDevice(T)

  1. 解决方案:

在所有派生程序中手动添加方法。

  • 问题:

不保证派生者提供方法。


你有解决办法吗?在尝试解决这个问题时,我真的很困惑。

最佳答案

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

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

关于c# - 强制派生类实现接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29917929/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com