c# - 返回从基类继承的嵌套类

标签 c# inheritance monogame

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

我创建了一个名为 UserInterface 的大类.在这个类里面,有嵌套的类,比如Button , Checkbox , Scrollbar等,它们都继承自一个名为 UIObject 的基类. UI 上的每个对象都存储在私有(private) System.Collections.Generic.List<UIObject> 中称为 canvas .

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

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

我的尝试看起来像这样:

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

问题:此方法返回的对象始终是 UIObject而不是原始对象所属的继承类。这意味着它无法访问所述原始类的属性。例如,如果我想检查是否有 Button在 Canvas 上按下我会做以下事情:

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

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

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

如何使用原始类型从 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 slickButton = (Button)ui.GetObject("nameOfButton");

小心!如果对象实际上不是 Button,这将引发异常。

或者,您可以使用 as 运算符,如果对象不是 Button,它的计算结果为 null

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

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

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

Casting Reference

关于c# - 返回从基类继承的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47842880/

相关文章:

c# - 为什么重写 == 必须重写 equals?

c# - 从串口读取和发送数据

c# - 我应该使用 TCP 还是 UDP 作为 MMORPG 的网络协议(protocol)?

windows - Monogame OpenGL 游戏在某些 Windows 7 计算机上崩溃

java - 当我在 "player object"上使用名为 movePosition() 的方法时,它会更改由该类创建的所有其他对象的 x 位置

audio - 在 XNA/Monogame 中更改音调时,声音文件的播放持续时间如何变化?

c# - 尝试使用 Entity Framework 更新时,数据库中已经有一个名为 'AspNetRoles' 的对象

c# - 获取被点击的菜单项的文本?

c++ - 应该如何构建基本的类层次结构?

class - 基类中工厂方法的 typescript 返回类型