我正在为 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");
关于c# - 返回从基类继承的嵌套类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47842880/