2

我有一个 BaseClass,我使用继承从中派生了多个其他类。在其他地方,我希望能够从这些继承的类中的任何一个中检索属性,即使类的类型直到运行时才知道。

例如,假设我有两个派生自 BaseClass 的类

FirstClass : BaseClass
SecondClass : BaseClass

我的 BaseClass 有一个名为 ID 的属性,它是一个 int (以及许多其他属性)

在运行时,我的应用程序将接收“FirstClass”对象或 SecondClass 对象,但无论哪种方式,我都需要检索 ID 属性。

public int MyMethod(object unknownClass)
{
    int myID = unknownClass.ID; 
    return myID                    //...does not compile
}

public int MyMethod(object unknownClass)
{
    BaseClass tryCasting = (BaseClass)unknownClass;
    int myID = tryCasting.ID;           
    return myID                    //...does not compile either
}

我不确定还能尝试什么。如何在不知道对象类型的情况下获得我知道存在的属性?

4

3 回答 3

11

不要使用对象并使用BaseClass

public int MyMethod(BaseClass unknownClass)
{
    int myID = unknownClass.ID; 
    return myID;                    
}
于 2013-06-14T10:37:38.167 回答
2

请参阅 Darren Davies 的回答,了解您的具体 ID 案例。当属性是在派生类而不是基类中定义时,此答案中的方法很有用。


使用dynamic而不是object. 这将使用运行时来检索实际的对象类型。

public int MyMethod(dynamic unknownClass)
{
    int myID = (int)unknownClass.ID; 
    return myID;
}

或者,您可以使用反射来检索属性值:

var myID = (int)unknownClass.GetType().GetProperty("ID").GetValue(unknownClass);
于 2013-06-14T10:36:42.983 回答
1

多态是答案。您应该知道,当您创建从另一个派生的类时,派生类会立即从基类获取属性。因此,如果您不重新定义方法(覆盖),当您MyMethod在派生类上调用该方法时,它将始终调用基方法。所以下一个代码应该运行良好:

BaseClass { 
    private : int id ; 
    public  : int getId { return id ; }
} ;

FirstClass : BaseClass { DO NOT OVERRIDE getID ...} ; 

int main (void) { 
    BaseClass base ; 
    FirstClass first ; 
    base = first ; 
    base.getId() ; //Gets the id of first.
}

这个程序是做什么的?当您分配firstbase您 upcastfirst类型到BaseClass. 然后,当您执行base.getId()程序查找时,如果在 FirstClass 中有此方法的重新定义(覆盖),如果没有,则调用基本方法。

希望这些信息对您有用。您应该阅读 Bruce Eckels 的“Thinking in C++”的第一章,这是对面向对象编程的一个很好的介绍。

于 2013-06-14T10:51:59.600 回答