【问题标题】:Return nested class inherited from base class返回从基类继承的嵌套类
【发布时间】:2017-12-16 05:40:43
【问题描述】:

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

我创建了一个名为UserInterface 的大型类。在这个类中,有ButtonCheckboxScrollbar等嵌套类,它们都继承自一个名为UIObject的基类。 UI 上的每个对象都存储在名为 canvas 的私有 System.Collections.Generic.List<UIObject> 中。

使用该类的程序员可以通过使用公共方法UserInterface.Add(string name, UIObject obj) 轻松地将新对象添加到画布。当程序员将一个对象添加到画布上时,他们会为其指定一个名称,以便可以在列表中找到它。

当我尝试创建一个返回具有特定名称的对象的公共方法时,出现了我的问题。

我的尝试看起来像这样:

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

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

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

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

但是,这不起作用,因为属性IsPressed 属于Button 类,并且返回的对象是UIObject

如何使用原始类型从画布返回对象?

已解决:
非常感谢 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
}    

【问题讨论】:

  • if ((ui.GetObject("nameOfButton") as Button).IsPressed) 适合你吗?
  • 欢迎堆栈溢出!感谢您抽出宝贵时间阐明您的问题。
  • 如果您找到了问题的解决方案,请不要在标题中加上“SOLVED”或将解决方案添加到您的问题中;这些都不是在 UI 中解决的问题。相反,请将您的解决方案放在下面的“您的答案”框中,然后单击最能解决您的问题的答案左上角的绿色复选标记。可以将您自己的解决方案标记为答案。这会将您的问题标记为在 UI 中已解决,并使其他人可以轻松找到解决方案。
  • @DourHighArch 我已经用复选框标记了一个解决方案。我之前曾看到其他知名用户在他们的问题中提出了解决方案。

标签: c# inheritance monogame


【解决方案1】:

您需要将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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2011-06-19
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多