Это мой первый вопрос по StackOverflow, поэтому, пожалуйста, простите и скажите, что я делаю что-то не так.
Проблема:
Я пишу какой-то словарь, связанный с БД и текстомфайлы и т.д. ничего коммерческого, просто учусь.Для лучшего объяснения это может быть англо-французский.
Я хочу реорганизовать код, чтобы иметь возможность использовать один "общий" метод для обработки ввода для англо-французской и французско-английской модели словаря.В начале я сделал отдельную модель для каждого из них (я буду вставлять при необходимости), и теперь я хотел бы сделать все "универсальным".Что я делал, пока не остановился:
public interface IWordModel
{
int Id { get; set; }
string Name { get; set; }
string Definition { get; set; }
}
класс, реализующий IWordModel:
public class EnglishWordModel: IWordModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Definition { get; set; } = null;
}
public class FrenchWordModel : IWordModel
{
public int Id { get; set; }
public string Name { get; set; }
public string Definition { get; set; } = null;
}
Интерфейс, реализующий IWordModel и проблемный Список этого интерфейса:
public interface IDictionairyModel<T> where T : IWordModel
{
int Id { get; set; }
T BaseWord { get; set; }
List<T> DerivativeWords { get; set; }
}
Реализация классаIDicionairyModel
public class EnglishFrenchDictionairyModel<T>: IDictionairyModel where T : IWordModel
{
public int Id { get; set; }
public IWordModel BaseWord { get; set; } = new EnglishWordModel();
public List<IWordModel> DerivativeWords { get; set; } = = new
List<IWordModel>(new List<FrenchWordModel>());
}
public class FrenchDictionairyModel: IDictionairyModel<T> where T : IWordModel
{
public int Id { get; set; }
public IWordModel BaseWord { get; set; } = new FrenchWordModel();
public List<IWordModel> DerivativeWords { get; set; } = = new
List<IWordModel>(new List<EnglishWordModel>());
}
И мой вопрос
Как сделать это, то есть в экземпляре FrenchDictionairyModel мы сможем определить BaseWord только как FrenchWordModel и добавить в список DerivativeWords ТОЛЬКО EnglishWordModel?Я знаю, что это имеет что-то общее с ковариацией и контравариантностью, но я понятия не имею, как применить это здесь.
Это код выше с точки зрения опытного кодера, или это похоже наОК только в моей голове?Если ответ НЕТ, то как он должен выглядеть, какой шаблон мне использовать?
Как правильно использовать его в других методах?Как и сейчас, я использовал, например,
public List<EnglishFrenchDictionairyModel>
CreateEnglishFrenchEntrance(List<EnglishFrenchDictionairyModel> model){
(...)}
, но уже показывалось: «Использование универсального типа требует аргументов 1 типа».
Спасибо и хорошего дня!