我有一个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
}
我不确定还有什么可以尝试的。 如果首先没有了解对象类型,我怎样才能获得知道的属性?
答案 0 :(得分:11)
不要使用对象并使用BaseClass
:
public int MyMethod(BaseClass unknownClass)
{
int myID = unknownClass.ID;
return myID;
}
答案 1 :(得分:2)
请参阅Darren Davies的答案,了解您的ID特定情况。当在派生类中定义属性而不是基类时,此答案中的方法很有用。
使用dynamic
代替object
。这将使用运行时来检索实际的对象类型。
public int MyMethod(dynamic unknownClass)
{
int myID = (int)unknownClass.ID;
return myID;
}
或者,您可以使用Reflection来检索属性值:
var myID = (int)unknownClass.GetType().GetProperty("ID").GetValue(unknownClass);
答案 2 :(得分:1)
Polymorfism就是答案。您应该知道,当您创建从另一个派生的类时,派生类会立即从基类中获取属性。因此,如果您不重新定义方法(覆盖),当您在派生类上调用方法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.
}
这个节目是什么?当您将first
分配给base
时,您将first
类型转换为BaseClass
。然后,当您执行base.getId()
程序查找时,如果
如果没有调用基本方法,则在FirstClass中重新定义(覆盖)此方法。
希望您发现此信息有用。您应该阅读Bruce Eckels的“Thinking in C ++”的第一章,它是面向对象编程的一个很好的介绍。