Step 7 (S-10687)

From Stepik Wiki
Jump to: navigation, search

Step on Stepik: https://stepik.org/lesson/556/step/7

Step 7 (S-10687) 1.png

[00:00 - 00:17] другая часто встречающиеся в объектного программирования ошибка это использовании наследования в тех случаях где следует использовать агрегировать агрегирование это включение объектов 1 класса внутрь другого класса в качестве например если он будет записывать


[00:17 - 00:37] класс настольного компьютера то так она стоит на компьютер есть несколько структурный компонент клавиатура монитор блок питания то класс описывающий настольный компьютер могут включать в себя в качестве полей объекта соответствующее клавиатуре монитору


[00:37 - 00:51] блок питания в данном случае можно было бы сказать что класс настольного компьютера грядет в себя объекты классов клавиатуры монитора бог


[00:51 - 01:09] однако вряд ли кому то придет в голову у нас следовать класс настольного компьютера от класса например монитор ну это выглядит довольно странно хотя встречаются случаи когда такое использовании наследования вместо грик агрегирование может показаться нелогичным и даже чем то другом


[01:09 - 01:27] того чтобы разобраться в таких случаях давайте разберемся чем отношения наследования отличаются от отношения агрегировать да отношение наследования и отношение героя о позволяют включить данные 1 объекта внутрь другой объект другого класс


[01:27 - 01:42] однако отношение наследования составляет более сильные связи нежели отношение грядет во 1 при отношение к следованию мы получаем автоматическое приведение от


[01:42 - 01:57] объектов производного класса к объектам базового класса а во 2 производных классов появляется доступ к protected полям базовых кос таким образом связь которая создает ажиотаж более сильным


[01:57 - 02:15] в принципе даже без учета проведения а можно было сказать что отношения агрегирование предпочтительнее чем отношении нас лето потому что если в каком то месте можно заменить отношение наследования на отношение агрегирование и делать это легко


[02:15 - 02:32] то это нужно сделать по той причине что таким образом мы уменьшим связь между этими 2 классами чем меньше связи между классами тем более гибкими является дизайна же программ то есть меньше нужно менять при изменении 1 из компаний мы таким образом улучшаем


[02:32 - 02:51] абстракция инкапсуляция внутри нашего дизайна однако сами по себе приведение между объектом том тоже могут задавать а некоторые проблемы давайте рассмотрим пару примеров когда использование наследовании место агрегирование приводит к


[02:51 - 03:10] некорректном поведении некоторых например можно определить класс окружности к сроку не так как окружности задается координатами центра и радиусом то можно попытаться унаследовать класс сокол вот


[03:10 - 03:28] класса point который задает координаты точки координаты центра окружности в некоторых случаях это могло бы даже оказаться удобным потому что имея переменную типа руку можно было бы напрямую обращаться к координатам x


[03:28 - 03:45] циник и синтаксические там красиво удобно однако за счет того что наша наследование задает привидение ввод объектов производного класса корректно базового класса могли показа функции которые


[03:45 - 04:04] были бы предназначенный для работы с точками но куда можно было бы в том числе пилять окружности например предположим что есть некоторые функции distance который вычисляет расстояние между меня точка в эту функцию можно передать объекты типа 40 col


[04:04 - 04:19] но тогда он прочитает не расстояние между окружности расстояние между центрами этих окружность то есть мы получим некорректный ответ другой пример это наследование класса описывающего линейную


[04:19 - 04:36] систем уравнений от класса задаю еще матрицу ну наверно вы знаете что системы линейных уравнений можно задать при помощи матрица коэффициентов и столбца правой части и в принципе так как внутри систем линейных уравнений


[04:36 - 04:54] у нас по хорошему должны храниться 2 значения в матрице и столбец том можно было бы просто унаследует от матрицы и добавить производного класса 1 поле соответствующие права часть однако за счет того что мы используем отношение наследования отношение наследования задает


[04:54 - 05:09] преобразование объектов производного класса к объектам базового класса то мы могли бы к линейной системе применить какие то методы которые предназначены для матриц например функции транспонирования


[05:09 - 05:24] interest понятно но переворачивает на 30 менять местами столбцы и строки для матрица это естественно 5 серебреников равняется окажется может не иметь смысла например если у нас с систем уравнений она не квадратные а


[05:24 - 05:42] у нас 3 уравнение от 10 переменных систем уравнений потенциально может быть конечно и колю совершенно не важно если мы ее транспонируйте то мы получим систему из 10 уравнение 3 перемен однако стал без права части нас никуда не денется и раньше у нас был из 3 элементов а теперь


[05:42 - 05:59] откуда ты нужно найти столбец и 10 лет а так как мы применяем к линейной системе транспонирование определенную для матриц то правой части никак не изменяется нам только те данные которые


[05:59 - 06:17] были в классе матрица таким образом эта операция с 1 стороны будет работать для линейных систем в двойственном будет что то некорректное превращая линейную систему в какой то некорректный единую систему когда количество уравнений не соответствуют стоп то правую часть