【发布时间】:2017-12-16 05:40:43
【问题描述】:
我正在为 MonoGame 项目开发 UI 系统。
我创建了一个名为UserInterface 的大型类。在这个类中,有Button、Checkbox、Scrollbar等嵌套类,它们都继承自一个名为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