作为一个例子,我有一个名为baseAbstractClass的基类和几个派生类:
public class Derived : baseAbstractClass
{
public Derived()
{
}
// abstract methods go here
}
public class DerivedEx : baseAbstractClass
{
// code goes here
}
我有这个课程:
public class SomeClass
{
public SomeClass()
{
}
object ReturnMeAnObject(int whichObject)
{
object toReturn = null;
if (whichObject == 0)
{
toReturn = new Derived();
}
else
if (whichObject == 1)
{
toReturn = new DerivedEx();
}
return toReturn;
}
}
在我的主要功能中:
public class Start
{
static void Main()
{
SomeClass someClass = new SomeClass()
Derived derived = (Derived)someClass.ReturnMeAnObject(0);
}
}
我回来的对象在运行时才知道,但实际上我并不知道将返回对象的类型 - 它可能是Derived,或DerivedEx。 有没有比在Main函数中显示的返回值更简单的方法,因为这会导致一个非常大的switch语句或一组非常大的If ... Else条件。
我试图通过构建类图来确定我的设计是否正确,但似乎不适合代码。
非常感谢任何帮助。
答案 0 :(得分:1)
您的问题可以使用泛型来解决。您必须限制泛型参数T
并确保使用的类具有默认构造函数。
public T ReturnMeAnObject<T>() where T : baseAbstractClass, new()
{
return new T();
}
然后您可以在代码中使用它,如下所示:
SomeClass someClass = new SomeClass()
Derived derived = someClass.ReturnMeAnObject<Derived>();
DerivedEx derivedEx = someClass.ReturnMeAnObject<DerivedEx>();
答案 1 :(得分:0)
您可以在此处使用多态,并返回基类object
:
baseAbstractClass ReturnMeAnObject(int whichObject)
{
baseAbstractClass toReturn = null;
if (whichObject == 0)
{
toReturn = new Derived();
}
else
if (whichObject == 1)
{
toReturn = new DerivedEx();
}
return toReturn;
}
你可以测试一下:
SomeClass someClass = new SomeClass();
var derived = someClass.ReturnMeAnObject(0);
var DerviedTyped = Convert.ChangeType(derived,derived.GetType());
您可以使用Convert.ChangeType()
动态投射它:
SomeClass someClass = new SomeClass();
var derived = someClass.ReturnMeAnObject(0);
var derviedTypedObject = Convert.ChangeType(derived,derived.GetType());
答案 2 :(得分:0)
您也可以使用Reflection类。像:
object derived = someClass.ReturnMeAnObject(0);
Type t = derived.GetType();
switch (t.Name)
{
case "Derived":
//do something
break;
case "DerivedEx":
//do something
break;
default:
break;
}