Какие методы и свойства вы раскрываете - это дизайнерское решение. Какой базовый класс вы наследуете, это деталь реализации. Я чувствую, что стоит сделать шаг назад к первому.
Объект - это совокупность данных и поведения.
Итак, ваши первые вопросы должны быть:
Имейте в виду, что наследование подразумевает отношение «isa» (a), тогда как композиция подразумевает «имеет» (hasa) связь. Выберите правильный вариант для вашей ситуации в своем представлении, учитывая, что ситуация может измениться по мере развития вашего приложения.
Подумайте о мышлении в интерфейсах, прежде чем думать о конкретных типах, поскольку некоторым людям легче поставить свой мозг в «режим дизайна» таким образом.
Это не то, что каждый делает сознательно на этом уровне в повседневной кодировке. Но если вы обдумываете такую тему, вы стучите в проектные воды. Осознание этого может быть освобождением.
Взгляните на список & lt; T & gt; и IList & lt; T & gt; на MSDN или Visual Studio. Посмотрите, какие методы и свойства они выставляют. Считаете ли вы, что эти методы выглядят так, как будто кто-то хочет сделать с FootballTeam на ваш взгляд?
Does footballTeam.Reverse () имеет для вас смысл? Будет ли footballTeam.ConvertAll & lt; TOutput & gt; () выглядеть так, как вы хотите?
Это не спорный вопрос; ответ может быть действительно «да». Если вы реализуете / наследуете List & lt; Player & gt; или IList & lt; Player & gt ;, вы застряли с ними; если это идеально для вашей модели, сделайте это.
Если вы решите «да», это имеет смысл, и вы хотите, чтобы ваш объект обрабатывался как коллекция / список игроков (поведение), и поэтому вы хотите реализовать ICollection или IList, во что бы то ни стало. Понятно:
class FootballTeam : ... ICollection<Player>
{
...
}
Если вы хотите, чтобы ваш объект содержал коллекцию / список игроков (данных), и поэтому вы хотите, чтобы коллекция или список являлись свойством или членом, непременно сделайте это. Понятно:
class FootballTeam ...
{
public ICollection<Player> Players { get { ... } }
}
Возможно, вы захотите, чтобы люди могли только перечислять множество игроков, а не считать их, добавлять к ним или удалять их. IEnumerable & л; Игрок & GT; является вполне допустимым вариантом для рассмотрения.
Вы можете почувствовать, что ни один из этих интерфейсов не является полезным в вашей модели вообще. Это менее вероятно (IEnumerable & lt; T & gt; полезен во многих ситуациях), но это все еще возможно.
Любой, кто пытается сказать вам, что одно из них категорически и окончательно неверно , в каждом случае ошибочно. Любой, кто пытается вам рассказать, категорически и окончательно вправо в каждом случае ошибочен.
. Когда вы решите данные и поведение, вы можете принять решение о реализации. Это включает в себя конкретные классы, от которых вы зависите от наследования или композиции.
Это не может быть большим шагом, и люди часто сталкиваются с дизайном и реализацией, поскольку вполне возможно пропустить все это в вашей голове через секунду или два и начать печатать.
Искусственный пример: как отмечали другие, команда не всегда является «просто» коллекцией игроков. Поддерживаете ли вы коллекцию партитур для команды? Является ли команда взаимозаменяема с клубом, в вашей модели? Если это так, и если ваша команда является коллекцией игроков, возможно, она также является коллекцией персонала и / или коллекцией баллов. Тогда вы закончите:
class FootballTeam : ... ICollection<Player>,
ICollection<StaffMember>,
ICollection<Score>
{
....
}
Несмотря на дизайн, на данном этапе C # вы не сможете реализовать все это путем наследования из List & lt; T & gt; так или иначе, поскольку C # "only" поддерживает одиночное наследование. (Если вы пробовали этот malarky в C ++, вы можете считать это хорошим делом). Реализация одной коллекции через наследование и одна с помощью композиции, вероятно, показала грязной. И такие свойства, как Count, становятся запутанными для пользователей, если вы явно не реализуете ILIst & lt; Player & gt; .Count и IList & lt; StaffMember & gt; .Count и т. Д., А затем они просто болезненны, а не запутывают. Вы можете видеть, где это происходит; (а также правильно или неправильно, ваши коллеги могут также, если бы вы реализовали его таким образом!)
. Руководство по не наследованию классов коллекций не является специфичным для C #, вы найдете его на многих языках программирования. Получается мудрость, а не закон. Одна из причин заключается в том, что на практике считается, что композиция часто выигрывает над наследованием с точки зрения понятности, реализуемости и ремонтопригодности. Чаще всего с объектами реального мира / домена можно найти полезные и последовательные отношения «hasa», чем полезные и последовательные отношения «isa», если вы не вникаете в абстрактные, особенно с течением времени и точные данные и поведение объектов в коде изменения. Это не должно заставлять вас всегда исключать наследование из классов коллекции; но это может быть наводящим на размышления.
Просто мало изменения и Вы получили его:
UPDATE book_details
SET live = 1
WHERE ISBN13 in (SELECT ISBN13 FROM book_details_old WHERE live = 1);
UPDATE book_details AS bd, book_details_old AS old
SET bd.live=1
WHERE bd.isbn13=old.isbn13
AND old.live=1;