返回从基类

时间:2017-12-16 05:40:44

标签: c# inheritance monogame

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

我创建了一个名为UserInterface的大型类。在此类中,有嵌套类,如ButtonCheckboxScrollbar等,它们都从一个名为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
}    

1 个答案:

答案 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) { ... });

Casting Reference