使用基类中的静态方法实例化继承的类

时间:2010-04-14 13:34:08

标签: c# inheritance class-factory

我有一个抽象的基类,我有很多继承的类。我想要做的是一个静态成员接受一个字符串,第一个可以解析字符串的类(只有一个继承的类应该能够)并返回一个继承类的实例。

这就是我目前正在做的事情。

public static Epl2Command GenerateCommandFromText(string command)
{
    lock (GenerateCommandFromTextSyncRoot)
    {
        if (!Init)
        {
            Assembly a = Assembly.GetAssembly(typeof(Epl2Command));
            Types = new List<Type>(a.GetTypes());
            Types = Types.FindAll(b => b.IsSubclassOf(typeof(Epl2Command)));
            Init = true;
        }
    }
    Epl2Command ret = null;
    foreach (Type t in Types)
    {

        MethodInfo method = t.GetMethod("GenerateCommand", BindingFlags.Static | BindingFlags.Public);

        if (method != null)
            ret = (Epl2Command)method.Invoke(null, new object[] { command });
        if (ret != null)
            break;
    }
    return ret;
}

我希望这样,所以我的代码会检查所有继承的类,而不会让未来的程序员回来并在添加更多继承类时编辑这个函数。

有没有办法可以强制继承的类实现自己的GenerateCommand(string)

public static abstract Epl2Command GenerateCommand(string command)无效c#。 Or am I hammering a nail in with a shoe when I should be using a hammer;任何更好的方式来做这个类工厂将不胜感激。

2 个答案:

答案 0 :(得分:1)

C#不支持静态接口,因此您无法定义静态构建器方法,如

public interface ICommand
{
    static ICommand CreateCommand(string command);
}

我同意凯文,你需要一个工厂模式。我会更进一步,并说每个命令类型也需要一个构建器。喜欢这个

public interface ICommandBuilder
{
    bool CanParse(string input);
    ICommand Build(string input);
}

public interface ICommandBuilder<TCommand> : ICommandBuilder 
    where TCommand : ICommand
{
    TCommand Build(string input);
}

然后你的工厂可以接受任何输入命令字符串,查询所有构建器,如果他们可以解析该字符串,并在可以的那个上运行Build。

public interface ICommandFactory
{
    ICommand Build(string input);
}

public class CommandFactory
{
    public ICommand Build(string input)
    {
        var builder = container.ResolveAll(typeof(ICommandBuilder))
            .First(x => x.CanParse(input));
        return builder.Build(input);
    }
}

答案 1 :(得分:0)

您要解决的是工厂方法:

http://www.dofactory.com/Patterns/PatternFactory.aspx

以下是如何实施它的链接。