我想要做的是选择适当的类来实例化基于传入的括号。 目前,我有两个类(ClassA和ClassB),并根据括号使用2种方法调用这些im。什么 我想实现的是只使用一种方法基于传递的字符串括号实例化ClassA或ClassB。
我真的不知道如何传回类对象来使用..
我的方法是在方法A中调用类来实例化然后我可以使用它。 ClassA myclass = new ClassA();
我确实考虑过使用以下内容,但我不知道(如果我很诚实)知道如何实例化对象o或在MyMethod传回时使用它。 object o似乎不允许我访问A类或B类中的公共字符串方法。
public class ClassA
{
public ClassA()
{
//Do something for Class A
}
public string msgA()
{
return "Here is msg A";
}
}
public class ClassB
{
public ClassB()
{
//Do something for Class B
}
public string msgB()
{
return "Here is msg B";
}
}
private string MyMethod()
{
object o = GetClassToInstantiate("ClassA");
//Use object o
}
private object GetClassToInstantiate(string parameter)
{
object temp = null;
switch (parameter)
{
case "ClassA":
temp = new ClassA();
break;
}
return temp;
}
任何建议我如何解决这个可能非常容易的情况。
答案 0 :(得分:12)
您需要的是基类中的工厂方法:
enum ClassType { ClassA, ClassB }
class ClassBase
{
public static ClassBase Create(ClassType classType)
{
switch (classType)
{
case ClassType.ClassA: return new ClassA();
case ClassType.ClassB: return new ClassB();
default: throw new ArgumentOutOfRangeException();
}
}
}
class ClassA : ClassBase
{
}
class ClassB : ClassBase
{
}
查看Factory method pattern上的维基百科文章了解更多信息。
答案 1 :(得分:4)
您想要做的事情通常不被视为非常有用的操作。当你完成所有你知道的结果是它是一个对象。您不知道它提供的任何方法或属性。由于C#没有(目前很快将在v4中)允许后期绑定,因此你无法对结果做任何事情。
当A类和B类实现公共接口或从公共基类继承时,它变得更加有趣。在这种情况下,您可以使用一个通用方法来实例化您的真实类,但将其作为公共接口返回。这更有用,例如使用插件架构。
答案 2 :(得分:4)
我会为您的类使用通用接口,并使用通用工厂方法使用单独的工厂类,如下所示: -
class Program
{
static void Main(string[] args)
{
IAnimal animal = AnimalFactory.CreateAnimal<Dog>();
animal.Speak();
Console.ReadKey();
}
}
public abstract class AnimalFactory
{
public static IAnimal CreateAnimal<T>() where T : IAnimal, new()
{
return new T();
}
}
public interface IAnimal
{
void Speak();
}
public class Dog : IAnimal
{
public void Speak()
{
Console.WriteLine("Woof");
}
}
public class Cat : IAnimal
{
public void Speak()
{
Console.WriteLine("Meow");
}
}
答案 3 :(得分:2)