1

多くの継承クラスから派生した抽象基本クラスがあります。私がやりたいのは、静的メンバーが文字列を受け取ります。これは、文字列を解析できる最初のクラスであり(継承されたクラスの1つだけが解析できるはずです)、継承されたクラスのインスタンスを返します。

これは私が現在行っていることです。

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#ではありません。または、ハンマーを使用する必要があるときに、靴で釘を打ち込みますか。このクラスファクトリを実行するためのより良い方法をいただければ幸いです。

4

2 に答える 2

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);
}

次に、ファクトリは任意の入力コマンド文字列を受け入れ、その文字列を解析できるかどうかすべてのビルダーにクエリを実行し、可能なものでビルドを実行できます。

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);
    }
}
于 2010-04-14T14:46:54.107 に答える
0

あなたが避けているのはファクトリメソッドです:

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

これを実装する方法のリンクは次のとおりです。

于 2010-04-14T13:37:42.497 に答える