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是三个公共类,那么该函数的返回类型应该是什么?如何动态确定?
答案 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#