Return 嵌套 class 继承自基础 class

Return nested class inherited from base class

我正在为 MonoGame 项目开发 UI 系统。

我创建了一个名为 UserInterface 的大型 class。在这个class里面,嵌套了class,比如ButtonCheckboxScrollbar等,都是从一个基class继承而来的称为 UIObject。 UI 上的每个对象都存储在名为 canvas.

的私有 System.Collections.Generic.List<UIObject>

使用此 class 的程序员可以使用 public 方法 UserInterface.Add(string name, UIObject obj) 轻松地将新对象添加到 canvas。当程序员将对象添加到 canvas 时,他们会为其分配一个名称,以便可以在列表中找到它。

我的问题出现了,因为我试图制作一个 public 方法,该方法将 return 具有特定名称的对象。

我的尝试是这样的:

public UIObject GetObject(string nameOfObject)
{
    return canvas.System.Linq.FirstOrDefault(o => o.Name == nameOfObject);
}

问题:通过此方法编辑的对象 return 始终是 UIObject 而不是原始对象所属的继承 class。这意味着它无法访问所述原始 class 的属性。例如,如果我想检查 canvas 上的 Button 是否被按下,我会执行以下操作:

UserInterface ui = new UserInterface();
ui.Add("nameOfButton", new Button());

if (ui.GetObject("nameOfButton").IsPressed)
{
    // Do stuff
}

但是,这将不起作用,因为 属性 IsPressed 属于 Button class 而 returned 对象是 UIObject.

如何return canvas 中的对象使用它们的原始类型?

已解决:
非常感谢 Austin Brunkhorst 将我引向仿制药!

工作方式:

public T GetObject<T>(string nameOfObject) where T : UIObject
{
    return canvas.System.Linq.FirstOrDefault(o => o.Name == nameOfObject) as T;
}

方法是这样调用的:

UserInterface ui = new UserInterface();
ui.Add("nameOfButton", new Button());

if (ui.GetObject<Button>("nameOfButton").IsPressed)
{
    // Do stuff
}    

您需要将 UIObject 转换为您要使用的类型。在这种情况下,Button.

Button slickButton = (Button)ui.GetObject("nameOfButton");

小心!如果对象实际上不是 Button.

,这将引发异常

或者,您可以使用 as 运算符,如果对象不是 Button.

,则计算结果为 null
Button slickButton = ui.GetObject("nameOfButton") as Button;

我建议研究泛型,因为您可以通过明确说明您期望的类型并让该方法为您发挥魔力来避免这种情况。

Button slickButton = ui.GetObject<Button>("nameOfButton");

Casting Reference