我正在为MonoGame项目开发UI系统。
我创建了一个名为UserInterface
的大型类。在此类中,有嵌套类,如Button
,Checkbox
,Scrollbar
等,它们都从一个名为UIObject
的基类继承。 UI上的每个对象都存储在名为System.Collections.Generic.List<UIObject>
的私有canvas
中。
使用此类的程序员可以使用公共方法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
}
答案 0 :(得分:1)
您需要将Button
转换为您要使用的类型。在这种情况下,Button slickButton = (Button)ui.GetObject("nameOfButton");
。
Button
小心!如果对象实际上不是as
,则会抛出异常。
或者,您可以使用null
运算符,如果对象不是Button
,则运算符的结果为Button slickButton = ui.GetObject("nameOfButton") as Button;
。
Button slickButton = ui.GetObject<Button>("nameOfButton");
我建议您查看泛型,因为您可以通过明确说明您期望的类型来避免这种情况,并让方法为您带来魔力。
template <class DerivedType, class BaseType, class F>
void for_each(vector<BaseType *> elems, F && f) {
for (auto elem : elems)
if (auto ptr = dynamic_cast<DerivedType*>(elem))
f(elem);
}
//usage
for_each<Wound>(allelems, [](Wound * w) { ... });
for_each<Disease>(allelems, [](Disease * d) { ... });