动态确定不同类的函数返回类型?

时间:2013-12-19 11:17:40

标签: c#

public <return_type> getclass(string company)
{
    switch (company)
    {
        case "cmp1": Classcmp1 temp = new Classcmp1(); return temp ;
        case "cmp2": Classcmp2 temp = new Classcmp2(); return temp ;
        case "cmp3": Classcmp3 temp = new Classcmp3(); return temp ; 
    }
}

如果classcmp1,classcmp2,classcmp3是三个公共类,那么该函数的返回类型应该是什么?如何动态确定?

5 个答案:

答案 0 :(得分:7)

您始终可以返回一个对象,因为所有类都继承自object:

public object getclass(string Company)
{
    switch (Company)
    {
        case "cmp1": classcmp1 temp = new classcmp1(); return temp ;
        case "cmp2": classcmp2 temp = new classcmp2(); return temp ;
        case "cmp3": classcmp3 temp = new classcmp3(); return temp ; 
    }
}

否则,您可以构建一个类,您的三个类将继承该类:

public class classcmp { }
public class classcmp1 : classcmp {}
public class classcmp2 : classcmp {}
public class classcmp3 : classcmp {}

public classcmp getclass(string Company)
{
    switch (Company)
    {
        case "cmp1": classcmp1 temp = new classcmp1(); return temp ;
        case "cmp2": classcmp2 temp = new classcmp2(); return temp ;
        case "cmp3": classcmp3 temp = new classcmp3(); return temp ; 
    }
}

否则,您可以构建一个界面:

public interface Iclasscmp { }
public class classcmp1 : Iclasscmp {}
public class classcmp2 : Iclasscmp {}
public class classcmp3 : Iclasscmp {}

public Iclasscmp getclass(string Company)
{
    switch (Company)
    {
        case "cmp1": classcmp1 temp = new classcmp1(); return temp ;
        case "cmp2": classcmp2 temp = new classcmp2(); return temp ;
        case "cmp3": classcmp3 temp = new classcmp3(); return temp ; 
    }
}

您将做出的选择将影响您的程序的体系结构。由于没有关于您需要的课程使用的更多信息,很难帮助您。

答案 1 :(得分:3)

所有classcmpX类是否共享一个公共类/接口?

  • 如果是,请返回该类型。
  • 如果没有,你能让它们扩展/实现一个通用的类/接口吗?
  • 如果没有,请返回object,c#中所有类型的类扩展(*)。

(*)好,除了指针类型。

答案 2 :(得分:3)

对象是最通用的返回类型,您可以试试这个。

此外,您不需要初始化temp,只需create.initialize该对象并将其返回。

public object getclass(string Company)
{
    switch (Company)
    {
        case "cmp1": return new classcmp1();
        case "cmp2": return new classcmp2();
        case "cmp3": return new classcmp3();
    }
}

答案 3 :(得分:1)

你的getClass方法必须提供“某种程度上”相关的类:它们是否实现了一个通用接口?他们都是从同一个父类继承的吗? 你应该做的是明确这个关系,然后你可以使用这个父类或接口作为getClass方法的返回类型。

选择继承方案与让类实现相同的接口是非常随意的。常见的问题是问自己,你的类是“相同的东西(继承)”还是“它们”具有相同的行为(界面)。苹果和橘子'是'水果,他们'有'重量,所以他们继承水果并实施IWeight ......但同样他们'是'SolidObjects并实施ITasteGood :-)

在你的情况下,我倾向于相信你想做一个父抽象/虚拟(VB中的MustInherit)类,你的3个类将继承。

我不明白你的方法是否有相同的签名(==参数列表)。如果不是这样,请记住您可以通过单个对象发送所有参数,并再次拥有相同的签名。

((仅为了记录,你在这里实现的模式(根据参数提供一个类)是工厂模式。))

答案 4 :(得分:1)

我认为在你的案例中最好的解决方案是像Cyril Gandon已经建议的界面。

public interface IClasscmp {}
public class Classcmp1 : IClasscmp {}
public class Classcmp2 : IClasscmp {}
public class Classcmp3 : IClasscmp {}

public IClasscmp GetClass(string company)
{
    switch (company)
    {
        case "cmp1": return new Classcmp1();
        case "cmp2": return new Classcmp2();
        case "cmp3": return new Classcmp3(); 
    }
}

但是为C#使用正确的命名约定也是好的。它支持更好的可读性,stackoverflow上的语法高亮也可以工作。 ;) 请参阅:Naming Convention in c#