Вы понимаете Обобщение.
Ассоциациями могут быть Агрегации или Композиции (или ни одна из них). Это хороший пример, который использовал Том Пендер. Предположим, у вас есть класс Car. В этом классе автомобилей «есть» рулевое колесо, сиденья, две оси, четыре колеса и т. Д. Если вы создаете этот автомобиль в контексте производителя, отношения между ними будут составлять: Состав всех частей автомобиля (у вашего производителя) привязан к сроку службы автомобиля. С точки зрения производителя, срок службы автомобиля и всех его частей заканчивается, когда вы доставляете его дилеру.
Теперь давайте предположим, что вы являетесь владельцем свалки. В этом случае автомобиль все еще «имеет» все эти части, но у них есть своя собственная жизнь: вы можете продавать детали с автомобиля и даже делать их частью какого-либо другого автомобиля, если вам нужно. Связь между автомобилем и этими частями - это агрегация, поскольку срок службы деталей не привязан к времени жизни самого автомобиля.
Итак, вы можете видеть, что один и тот же автомобиль может быть смоделирован по-разному в зависимости от контекста.
Что касается абстрактных классов: абстрактный класс - это просто класс, который определяет методы и/или свойства, требуя, чтобы их можно было реализовать только в подклассах. Проще всего объяснить, почему с интерфейсами. Интерфейсы - это абстрактные классы, с добавленной оговоркой, что NONE из методов или свойств может быть реализовано непосредственно в классе (вы можете сказать, что это определение того, как определить подкласс). Вот где они приходят полезными.
Предположим, я хочу определить класс Animal. Что делают животные? Ну, они двигаются. Они кусают. (Конечно, они делают и другие вещи, но давайте придерживаться Move and Bite.) Если я создаю интерфейс Animal, я говорю: «Вот что делает животное. Если вы хотите быть животным, вам также нужно сделать но я не собираюсь рассказывать вам, как им это делать ». Итак, я создаю интерфейс iAnimal, используя два метода: Move and Bite. В качестве интерфейса я не предоставляю никакой реализации, просто пустые процедуры.
Теперь предположим, что у меня есть два животных, блоха и TRex. Ясно, что блохи и TRexes не имеют ничего общего в том, как они двигаются, или о том, как они кусают, но оба делают оба. У меня будет Flea и TRex наследуют или «реализуют» интерфейс, обеспечивая реализации Move и Bite, соответствующие типу животного.
Преимущество этого в том, что клиенты моей блохи и trex не должны знать, с кем они имеют дело.Они могут создавать iAnimal, при необходимости вставлять экземпляр Flea или TRex и безопасно вызывать методы Move и/или Bite для iAnimal без поддержки или отсутствия поддержки. (Это то, что мы подразумеваем под «полиморфизмом»).
Итак, реализация интерфейса - это форма обобщения (более правильно Специализация, идя в другую сторону), как вы, вероятно, уже догадались.
Отсюда «абстрактный класс» - это просто любой класс с любым определенным способом или атрибутом, который должен быть унаследован для реализации. Поэтому, как я уже сказал, интерфейсы являются абстрактными классами. Однако в общем случае абстрактным классом считается то, что не является также интерфейсом, т.е. е. который имеет некоторые конкретные методы или атрибуты. Большинство языков программирования придерживаются этого определения.
Частичный ответ, который другие могут не уловить: ученик и учитель - это роли, а не люди. Использование специализаций делает невозможным, чтобы человек был учителем и учеником одновременно или по истории. –