HAS-A, IS-A терминология в объектно-ориентированном языке - PullRequest
58 голосов
/ 08 февраля 2010

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

Ответы [ 10 ]

142 голосов
/ 08 февраля 2010

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

  1. Дом является зданием (наследство);
  2. Дом имеет Комната (состав);
  3. В доме имеется арендатор (агрегация).

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

53 голосов
/ 08 февраля 2010

A Car has-a Wheel.

A Sparrow is-a Bird.

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

15 голосов
/ 08 февраля 2010

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

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

6 голосов
/ 16 февраля 2017

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

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

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

enter image description here

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

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

Если снова взять класс Vehicle , класс Driver будет считаться агрегацией, поскольку класс Driver может существовать как независимый объект, даже если Автомобиль класс перестает существовать.

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

enter image description here

6 голосов
/ 08 февраля 2010

Является = Специальным видом, например, Автомобиль является специальным видом Транспортного средства.

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

6 голосов
/ 08 февраля 2010

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

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

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

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

5 голосов
/ 15 сентября 2016

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

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

Пример:

Собака ЕСТЬ Животное. Это имеет способность к обучению.

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

4 голосов
/ 08 февраля 2010

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

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

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

2 голосов
/ 08 февраля 2010

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

1 голос
/ 22 октября 2016

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...