返回一个未知的对象

时间:2015-05-15 06:49:18

标签: c# class polymorphism

作为一个例子,我有一个名为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条件。

我试图通过构建类图来确定我的设计是否正确,但似乎不适合代码。

非常感谢任何帮助。

3 个答案:

答案 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());

EXAMPLE FIDDLE

UPDATE:

您可以使用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;
        }