28
Разбор задач Инкапсуляция Полиморфизм Задание References Инкапсуляция и полиформизм Информатика 10-11 классы 5 марта 2012 г. Информатика 10-11 классы Инкапсуляция и полиформизм

Инкапсуляция и полиморфизм в ruby

Embed Size (px)

DESCRIPTION

Инкапсуляция и полиморфизм в ruby

Citation preview

Page 1: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Инкапсуляция и полиформизм

Информатика10-11 классы

5 марта 2012 г.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 2: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Разбор задач.

Задача 1. Написать класс Прямоугольник — наследникPolygon. Определить в нём метод подсчёта площади.Проверить корректность его работы.Самым простым способом подсчёта площади являетсяперемножение длинной стороны прямоугольника накороткую. Данные о сторонах мы имеем в свойстве sides,поэтому задача становится весьма несложной.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 3: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Задача 1

Listing 1: Задача 1

c l a s s Polygon. . .

end

c l a s s Rec tang l e < Polygondef squa r e

@square = @s i d e s [ 0 ] ∗ @s i d e s [ 1 ]end

end

r = Rec tang l e . newr . s i d e s = [ 10 , 2 , 1 0 , 2 ]put s r . squa r e

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 4: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Задача 2

Задача 2. Написать в классе Прямоугольник метод,определяющий, является ли прямоугольник квадратом.Метод должен возвращать булевский ответ. Проверитькорректность работы метода.Вспомним, что булевский ответ — это истина или ложь. Вкачестве правил хорошего тона булевские методы следуетоканчивать на знак вопроса.Назовём наш метод square?.Алгоритм: прямоугольник является квадратом, когда всеего углы и стороны равны между собой. Достаточнопроверить три угла, так как чётвёртый получаетсявычитанием из 360.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 5: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Решение задачи 2

Listing 2: Задача 2

c l a s s Rec tang l e < Polygon. . .de f squa r e ?

i f ( ( @ s i d e s [ 0 ] == @s i d e s [ 1 ] ) &&( @s i d e s [ 1 ] == @s i d e s [ 2 ] ) &&( @s i d e s [ 2 ] == @s i d e s [ 3 ] ) &&( @co rne r s [ 0 ] == 90) &&( @co rne r s [ 1 ] == 90) &&( @co rne r s [ 2 ] == 90))

t r uee l s e

f a l s eend

endend

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 6: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Задача 3

Задача 3. Создать в классе Треугольник метод,проверяющий, является ли данный треугольникпрямоугольным. Проверить корректность работы метода.Алгоритм: треугольник является прямоугольным, есливыполнено условие теоремы Пифагора: сумма квадратовкатетов равна квадрату гипотенузы.Для быстрого определения, какая сторона самая большая,используем метод sort для массива сторон.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 7: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Решение задачи 3

Listing 3: Задача 3

c l a s s Tr i a n g l e < Polygon. . .def r e c t a n g u l a r ?

s i d e s = @s i d e s . s o r ti f ( s i d e s [ 2 ]∗∗2 == ( s i d e s [ 0 ]∗∗2 + s i d e s [ 1 ] ∗ ∗ 2 ) )

t r uee l s e

f a l s eend

end. . .

end

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 8: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Три кита ООП

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 9: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

ИнкапсуляцияНаследованиеПолиморфизм

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 10: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

ИнкапсуляцияНаследованиеПолиморфизм

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 11: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Инкапсуляция

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 12: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Инкапсуляция

Объектно–ориентированное программирование позволяетиспользовать парадигму чёрного ящика для сокрытиялогики приложения.Написав однажды какой-либо метод, нет смыславпоследствии вникать в его содержимое.Более того, другие программисты могут вообще не знатьреализацию конкретного метода, но вполне уметь егоиспользовать.Такой подход в объектно-ориентированномпрограммировании называется инкапсуляция.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 13: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Пример с уравнением ax + b = c

Listing 4: Инкапсуляция

c l a s s L i n e a rEqua t i o na t t r_a c c e s s o r : a , : b , : cdef i n i t i a l i z e ( a , b , c )

@a = a@b = b@c = c

endde f s o l v e

i f (@a == 0)r e t u r n "any" i f (@b == @c)r e t u r n "no␣ s o l u t i o n s "

e l s ex = (@c − @b) / @a

endend

end

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 14: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Разбор кода

В этом коде были использованы несколько новыхконструкций. Вы можете его не понимать. Но самоеважное — он работает, а, значит, в соответствии спринципом инкапсуляции (в данном случае — сокрытия)вы можете его использовать.Например, решим уравнение: 2x - 4 = 6.

Listing 5: Используем код

eq = L i n ea rEqua t i o n . new (2 , −4, 6)put s eq . s o l v e

Итого: инкапсуляция позволяет использовать любой код без необходимостипонимать, как оно устроено внутри.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 15: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Конструкторы

В классе LinearEquation мы использовали неизвестный намранее метод initialize.Это — специальный метод. Он называется конструктор.Конструктор — это метод, который вызывается присоздании нового объекта.Конструкторы используются для автоматизации задач,которые нужно выполнить при создании объекта.В нашем примере мы сразу в конструктор передаёмисходные данные задачи, чтобы не “забивать” их вручную.Для передачи данных в конструктор мы в метод newпередаём нужные параметры.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 16: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Дополнительно об инкапсуляции

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

1 Публичный метод2 Приватный метод3 Защищённый метод

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

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 17: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Полиморфизм

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 18: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Полиморфизм

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

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 19: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Пример полиморфизма

Listing 6: Полиморфизм

c l a s s Persona t t r_a c c e s s o r : f i r s t_name , : last_name , : middle_name , : j obdef getName

@f i rst_name + ’ ␣ ’ + @middle_nameend

end

c l a s s Teacher < Personend

c l a s s Student < Personde f getName

@f i rst_nameend

end

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 20: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Polizei

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 21: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Пример полиморфизма

Listing 7: Полиморфизм

c l a s s P o l i z e i < Person # r e a l l y Person ???def getName

’ Herr ␣ P o l i z e i ’end

end

p = P o l i z e i . newput s p . getName

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 22: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Для чего нужен полиморфизм?

С помощью полиморфизма можно переопределять методыродительского класса.Часто имеется следующая ситуация: в 90% случаевметоды наследников полностью идентичны. В этом случаеобщий метод выносят в класс–родитель, чтобы недублировать код.Однако в 10% случаев есть необходимость по-другомуреализовать метод.Чтобы не вставлять в метод проверки и условия,используют полиморфизм, переопределяя метод толькотам, где нужно.Самостоятельное изучение. Перегрузка методов,перегрузка / переопределение операций.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 23: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Конструкторы при полиморфизме

В созданном классе «Учитель» мы можем автоматическипроставлять свойство job.Это проще всего сделать с помощью конструктора.

Listing 8: Конструктор в полиморфизме

c l a s s Teacher < Persondef i n i t i a l i z e

@job = "Teacher "end

end

t = Teacher . newput s t . j ob

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 24: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Конструктор родителя

А что делать, если мы хотим вызвать и конструкторродителя, и текущий? Ведь если мы переопределяем спомощью полиморфизма метод initialize, то “старый”забывается.Для этого в ruby есть специальный метод super.Простой вызов этого метода вызовет конструкторродителя.Разумеется, в метод super можно передавать аргументы.В предложенном на следующем слайде примере кодвыведет на экран две строчки: «B», «A».

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 25: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Код конструктора родителя

Listing 9: Конструктор родителя

c l a s s Adef i n i t i a l i z e ( l a b e l )

put s l a b e lend

end

c l a s s B < Adef i n i t i a l i z e

put s "B"super ( "A" )

endend

b = B. new

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 26: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Задание

Создать следующие классы: человек, ученик,ученик–раздолбай, учитель, директор.Каждый человек имеет: фамилию, имя, отчество, годрождения. Наследование определено в соответствии создравым смыслом (ученик–раздолбай — наследникученика). Все сущности имеют методы:

1 Посчитать возраст (getAges).2 обратиться по имени (getName) по правилу: учитель и

директор — имя + отчество, ученик — имя,ученик-раздолбай — “Бяка” + имя.

3 булевский метод главный (head?): для директоравозвращается истина, для остальных — ложь.

ФИО и год рождения должно задаваться в конструкторе.После реализации создать экземпляры каждого класса ивызвать для них методы getName, getAges, head?.

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 27: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

Сложное задание

Реализовать класс Двумерный Вектор.Класс имеет два свойства: x-компонента, y-компонента.Методы класса:

1 посчитать длину (модуль)2 прибавить к текущему вектору другой3 отнять от текущего вектора другой4 изменить знак вектора (-вектор)5 умножить вектор на скаляр (вещественное число)6 скалярно умножить на другой вектор

Информатика 10-11 классы Инкапсуляция и полиформизм

Page 28: Инкапсуляция и полиморфизм в ruby

Разбор задач Инкапсуляция Полиморфизм Задание References

References

При подготовке данного материала использовались сайты:http://ru.wikibooks.org/wiki/Ruby, http://rubydev.ru,http://en.wikipedia.org, http://ruby-lang.org, http://prosa.ru,http://guns.ru.Все презентации доступны на http://school.smirik.ru!Вопросы, предложения, д/з: [email protected]

Информатика 10-11 классы Инкапсуляция и полиформизм