Как использовать дженерики с заводским шаблоном?
Может ли кто-нибудь, пожалуйста, сказать мне, где я ошибаюсь со следующим кодом? (Я надеюсь, что ответ не "везде".)
Моя проблема заключается в том, что я не могу понять, как написать фабричную функцию для создания реальных экземпляров графических объектов. Конкретная ошибка компилятора этой последней попытки находится ниже кода.
public abstract class LogicBase {} public class LogicSubclassA : LogicBase { public string LogicSubclassAOnly => "LogicA"; } public class LogicSubclassB : LogicBase { public string LogicSubclassBOnly => "LogicB"; } public abstract class GraphicsBase<T> where T : LogicBase { public GraphicsBase( T logicObject ) => LogicObject = (T)logicObject; public T LogicObject { get; } } public class GraphicsSubclassA : GraphicsBase<LogicSubclassA> { public GraphicsSubclassA( LogicSubclassA logicObject ) : base( logicObject ) {} public void SomeFunction() { Console.WriteLine( LogicObject.LogicSubclassAOnly ); } } public class GraphicsSubclassB : GraphicsBase<LogicSubclassB> { public GraphicsSubclassB( LogicSubclassB logicObject ) : base( logicObject ) {} public void SomeFunction() { Console.WriteLine( LogicObject.LogicSubclassBOnly ); } } // Please see below the code for the specific compiler error. public static class GraphicsObjectFactory { public static GraphicsBase<LogicBase> CreateInstance( string specificType ) { switch( specificType ) { case "A": return new GraphicsSubclassA( new LogicSubclassA() ); case "B": return new GraphicsSubclassB( new LogicSubclassB() ); default: throw new ArgumentException(); } } }
Ошибка такова: не удается неявно преобразовать тип GraphicsSubclassA в GraphicsBase<LogicBase>
Что я уже пробовал:
Я прочитал несколько статей в интернете об использовании фабричного шаблона с дженериками, но ни одна из них, похоже, не помогает мне разобраться в моей конкретной проблеме здесь - главным образом потому, что мой мозг просто не настроен на то, чтобы умело обращаться с дженериками.
Этот вопрос является продолжением предыдущего вопроса, который я опубликовал здесь: предварительный вопрос
CHill60
Следуйте дальше или нет, какова ваша конкретная проблема?
Edit - заметил проблему как комментарий в вашем коде, но "не компилировать" не помогает - какова точная ошибка, о которой сообщается?
Patrick Skelton
Извините - я (надеюсь) улучшил вопрос.