ИМЕЕТ - A, терминология ISA на объектно-ориентированном языке

Я просто прочитывал книгу, и она имела условия, "ИМЕЕТ -" и "ISA" в нем. Кто-либо знает то, что они имеют в виду конкретно? Испытанный поиск в книге, но книге 600 страниц длиной.

62
задан braaterAfrikaaner 1 February 2018 в 06:27
поделиться

7 ответов

Это не зависит от Java, а от объектно-ориентированного программирования.

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

Иногда нет отношения IS-A между двумя классами, но «HAS-A» более подходит. Например, стул "HAS-A" на ножке. или несколько. это называется агрегированием, в отличие от наследования.

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

6
ответ дан 24 November 2019 в 16:30
поделиться

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

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

6
ответ дан 24 November 2019 в 16:30
поделиться

A Автомобиль имеет колесо .

A Воробей - это Птица .

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

54
ответ дан 24 November 2019 в 16:30
поделиться

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

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

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

4
ответ дан 24 November 2019 в 16:30
поделиться

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

2
ответ дан 24 November 2019 в 16:30
поделиться

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

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

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

145
ответ дан 24 November 2019 в 16:30
поделиться

Трие кажется очень хорошей идеей для ваших ограничений.

Альтернатива «мышления вне рамки»:

Если вы можете позволить себе некоторую вероятность ответа «present» на последовательность

EDIT: если вы можете позволить себе ложные положительные результаты, используйте фильтр Блума , как предложено WizardOfOdds в комментариях.

Для k = 1 фильтр Блума подобен хэш-таблице без ключей: каждое «ведро» - это просто логическое значение, указывающее, присутствовал ли хотя бы один вход с тем же хэшем. Если допустимо 1% ложных срабатываний, то размер хэш-таблицы может быть равен примерно 100 * 20 миллионам бит или примерно 200 МиБ. Для 1 из 1000 ложных срабатываний, 2GiB.

Использование нескольких хеш-функций вместо одной может улучшить ложноположительную скорость для одного и того же количества битов.

-121--1395521-

Рэп-намек Стюарта поставил меня в правильном направлении. С помощью статьи на эту тему мне удалось достичь того, что я хотел сделать. Я использую команду \mathclap , как определено в связанной статье.

Спасибо, xeen

-121--4435146-

Имеет - означает, что рассматриваемый класс «имеет» поле типа.

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

15
ответ дан 24 November 2019 в 16:30
поделиться