Если вы действительно практикуете объектно-ориентированное проектирование, тогда вы хотите использовать идею сокрытия информации. Как только вы начинаете вешать внутренние типы полей объекта person в общедоступном интерфейсе методов объекта членства, вы начинаете заставлять внешних разработчиков (пользователей) ваших объектов начинать изучение всех видов информации о том, что такое объект person и как он хранится и какой у него идентификатор.
Еще лучше, поскольку человек может иметь членство, почему бы вам просто не повесить метод "getMemberships" на класс этого человека. Кажется, гораздо более логично спросить человека, какое членство у него есть, чем спросить «членство», к каким клубам может принадлежать данное лицо ...
Редактировать - поскольку ОП обновился, чтобы указать, что он заинтересован в самом членстве, а не просто в качестве отношения между Персоном и Клубом, я обновляю свой ответ.
Короче говоря, класс "Клуб", который вы определяете, теперь вы просите вести себя как "клубный список". У клуба есть список , это не список . Реестр может иметь несколько функций, в том числе способы поиска лиц, принадлежащих к клубу. В дополнение к поиску человека по его идентификатору клуба, вы можете захотеть найти его по SSN, имени, дате вступления и т. Д. Для меня это говорит о том, что в классе "Club" есть метод getRoster (), который возвращает структуру данных, которая может искать всех людей в клубе. Назовите это коллекцией. Тогда возникает вопрос, можете ли вы использовать методы в уже существующих классах коллекций для удовлетворения потребностей, которые вы определили до сих пор, или вам нужно создать собственный подкласс коллекции, чтобы предоставить соответствующий метод для поиска записи о членстве.
Поскольку ваш класс иерархии, скорее всего, поддерживается базой данных, и вы, вероятно, занимаетесь загрузкой информации из базы данных и не обязательно хотите получать всю коллекцию только для того, чтобы получить одно членство, вы можете создать новый класс. Этот класс можно назвать, как я сказал, «Ростер». Вы получите его экземпляр из вызова getRoster () класса "club". Вы добавляете методы «поиска» в класс на основе любых критериев поиска, которые вам нужны, чтобы это была «общедоступная» информация о человеке ... имя, clubID, personID, SSN и т. Д. ...
Мой первоначальный ответ применяется только в том случае, если «членство» является чисто отношением, указывающим, к каким клубам и каким лицам относятся.