У меня есть базовый базовый класс, из которого у меня много унаследованных классов. То, что я хотел бы сделать, - это статический член, который принимает строку, первый класс, который может анализировать строку (только один из унаследованных классов должен иметь возможность) и возвращать экземпляр унаследованного класса.Создайте унаследованный класс, используя статический метод из базового класса
Это то, что я сейчас делаю.
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; любой лучший способ сделать эту фабрику класса будет оценен по достоинству.
Отличная статья Джона Скита на статических интерфейсах. http://goo.gl/WPpV –
, откуда взялся сговор? –
Это pseduo-код, предполагающий, что вы используете инверсию контейнера управления ... Windsor, StructureMap и т. Д. Если вы не используете IoC, вам нужно будет найти все типы ICommandBuilder и создать их вручную. –