我有一个抽象的基类,我有很多继承的类。我想要做的是一个静态成员接受一个字符串,第一个可以解析字符串的类(只有一个继承的类应该能够)并返回一个继承类的实例。
这就是我目前正在做的事情。
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;任何更好的方式来做这个类工厂将不胜感激。
答案 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)