Это довольно сложный вопрос, и я пробовал так много, что не могу вспомнить, что у меня есть, и еще не пробовал. Но в основном мой проект состоит из нескольких базовых классов для футбольной лиги. У меня есть следующие классы:
Лига - абстрактный базовый класс для лиги в моей библиотеке
Team - абстрактный базовый класс для команды в моей библиотеке
FootballLeague - получено из League (может быть лига любого другого типа, например, BaseballLeague, SoccerLeague и т. Д.)
FootballTeam - полученный из команды (такой же, как указано выше)
По сути, я хотел бы иметь список команд в классе Лиги, чтобы в этом классе я мог иметь более общие методы, которые могут работать только с объектами Команды. И тогда в моей FootballLeague можно будет ссылаться на тот же список, кроме как вернуть объекты FootballTeam (которые действительно содержится в списке).
Вот моя реализация на очень базовом уровне:
public abstract class League
{
protected IList mTeams;
}
public abstract class Team
{
public virtual League League
{
get;
protected set;
}
}
public class FootballLeague : League
{
public virtual IList<FootballTeam> Teams
{
get { return this.mTeams.Cast<FootballTeam>().ToList(); }
protected set { this.mTeams = value.ToList(); }
}
public FootballLeague() : base()
{
this.mTeams = new List<FootballTeam>();
this.mConferences = new List<FootballConference>();
}
}
Это работает в точности так, как я хочу, за исключением проблемы с NHibernate.
1) Когда я загружаю объект FootballLeague, он также загружает все объекты FootballTeam. Если я удаляю объявление mTeams в базовом классе и просто использую автоматическое получение / задание для IList в объектах FootballLeague, ленивая загрузка работает, и мои команды не загружаются, пока не получат доступ к коллекции. Таким образом, в основном имея эту переменную-член, к которой список обращается в базовом классе, NHiberate обходит отложенную загрузку.
Является ли эта реализация способом, которым вы будете обрабатывать этот тип библиотеки. В то время как у вас есть абстрактные базовые классы, которые должны иметь функциональность в списках, но производные классы также должны иметь возможность доступа к более специализированным версиям списка? Если нет, то как мне это реализовать, чтобы он работал с NHibernate?