HAS-A, IS-A терминология в объектно-ориентированном языке

Я просто читал книгу, в ней были термины "HAS-A" и "IS-A". Кто-нибудь знает, что они имеют в виду конкретно? Пробовал поиск в книге, но книга длиной 600 страниц.

10 ответов

Это объектно-ориентированное программирование и терминология UML, а не специфичная для Java. Есть на самом деле три случая, о которых вы должны знать:

  1. Дом есть здание (наследство);
  2. Дом имеет комнату (состав);
  3. Дом имеет жильца (объединение).

Разница между (2) и (3) является тонкой, но важной для дифференциации. Вместе они являются формами ассоциации. Какая разница? Композиция подразумевает, что дочерний объект не может жить вне контекста родителя (разрушить дом, и комнаты исчезают), тогда как совокупность означает, что ребенок может существовать сам по себе (разрушить дом, и обитатель уходит в другое место).

Car имеет Wheel,

Sparrow это Bird,

Академически, термины используются для выбора между составом и наследованием.

Has-a означает, что рассматриваемый класс "имеет" поле типа.

Is-a означает, что класс расширяется от суперкласса или реализует интерфейс. instanceof оператор вернется true если проверено против класса в этом случае.

Имена в значительной степени подразумевают все.

Класс IS-A можно рассматривать как специализированную ссылку на экземпляр другого класса, который наследует все его атрибуты.

Если класс с именем Vehicle существует. Тогда любой тип транспортного средства может наследовать атрибуты этого суперкласса. Например, Police Car унаследует все атрибуты Vehicle, потому что это специализация последнего.

введите описание изображения здесь

С другой стороны, класс HAS-A имеет ссылку на другой класс или экземпляр другого класса. Другими словами, он разделяет ассоциацию с другим классом. Существует два типа классов HAS-A: агрегация, означающая, что класс может существовать независимо, и композиция, означающая, что класс может существовать только вместе с тем, с которым он имеет связь.

Важно знать, когда классифицировать объект как составной класс или просто как атрибут другого класса.

Снова взяв класс Vehicle, класс Driver будет считаться совокупностью, поскольку класс Driver может существовать как независимая сущность, даже если класс Vehicle перестает существовать.

Принимая во внимание, что класс Engine не может существовать, если класс Vehicle не существует, потому что Engine не может существовать вне области действия Vehicle.

введите описание изображения здесь

" IS A ": устанавливает связь между связанными объектами. Вы можете использовать наследование, чтобы установить отношения.

"HAS A": Определяет возможности для возможно не связанных объектов. Вы можете использовать интерфейс для определения возможностей.

Пример:

Собака это животное. У него есть способность учиться.

Человек не животное. У него есть способность учиться, думать, взбираться и подавать заявку.

Это = Особый вид, например, Автомобиль - это особый вид Транспортного средства.

Имеет = У него есть что-то физическое, например, у автомобиля есть двигатель.

Это не специфично для Java, это специфично для OO.

IS-A означает, что у вас может быть класс, который "является" чем-то. Как студент "IS-A" человек. Это используется для описания одного объекта, являющегося подклассом другого.

Иногда нет отношения IS-A между двумя классами, но "HAS-A" является более подходящим. Например, стул "ХАС-А" на ножке. или несколько. это называется агрегацией, а не наследованием.

Я не буду вдаваться в подробности того, когда использовать каждый из них, потому что это зависит от того, как используются классы, и даже если известно, что так много нужно рассмотреть, новый вопрос для конкретного случая будет более уместным.

Как указывает Клетус, "а-а" - это другое. но будьте осторожны с has-a. это может означать композицию (пожизненную ответственность), агрегацию (часть-чего-то) или просто использование -a (имеет ссылку, знает, как ее создать или найти). последний просто ассоциация.

IS-A, HAS-A и т. Д. На самом деле не очень OO. Вместо Лискова принцип замещения - ОО.

Дядя Боб проливает свет на историю IS-A по адресу http://www.hanselminutes.com/default.aspx?showID=163

Роберт К. Мартин: Слово "ISA" вошло в наш словарь, и, кстати, это одно слово ISA, оно вошло в наш словарь по окольному пути и стало очень важным в объектно-ориентированных кругах, но не начиналось таким образом, В 80-х годах она проникла через толпу искусственного интеллекта, которая создала эти замечательные сети знаний, вы, возможно, помните это, всю шумиху по поводу искусственного интеллекта в конце 80-х, начале 90-х, а затем создала эти структуры, которые будут ходить по сетям знаний по этим механизмам логического вывода, и отношения между сущностями и сетями знаний с такими вещами, как, похожи на, на вкус похожи, пахнут как ISA, все эти - отношения являются, как, есть, и когда толпа ИИ потеряла свое финансирование, и все эти источники финансирования, они как бы оглянулись и сказали: "О, есть еще кое-что, это круто. Смотри, есть такие отношения, как будто они есть, они действительно похожи, мы должны просто переехать"." И они вроде как сделали, и словарный запас изменился. Это интересно, это также немного прискорбно, потому что наследование - это не ISA. Наследование, если вы посмотрите на него с очень тупым взглядом, наследование - это объявление методов и переменных в подобласти, и оно не имеет никакого отношения к ISA, и понятие ISA может быть очень запутанным. Простой пример: целое число - это действительное число, а действительное число - это комплексное число. Вы могли бы нарисовать это в своем UML, это было бы очень просто со всем наследованием там и так далее, но подумайте о попытке скомпилировать его. Целое число, которое, как мы надеемся, будет 16 или, может быть, 64 битами, но если оно должно быть производным от действительного числа, в действительном числе есть два целых числа: мантисса и характеристика, показатель степени и, как они использовали, они подразумевают двоичные точки внутри них. сделать эти числа с плавающей точкой. Число с плавающей точкой, действительное число, происходит от сложного, но в комплексе есть два действительных числа: мнимая и действительная части. Если бы вы думали о написании этого в C++ или в Java, вы бы написали структуру, которая не может быть скомпилирована, потому что она имеет бесконечную мысль. Имеет смысл в английском, не имеет никакого смысла в программном обеспечении.

Если вы разрабатываете коллекционный класс под названием "Школа". Вы бы имели "учителей" и "учеников" в школе. Вы разрабатываете класс "человек", и "ученик", и "учитель" наследуют класс "человек", так как оба являются "человеком". И у Ученика, и у Учителя день рождения. Вы должны создать "Класс свиданий", поскольку и у учителя, и у ученика есть "день рождения" или "день рождения" внутри "Класса человека". Это "контейнеровоз". Итак, "человек использует наследство" имеет "использует контейнеровоз".

Другие вопросы по тегам