Разбор задач Инкапсуляция Полиморфизм Задание References
Инкапсуляция и полиформизм
Информатика
10-11 классы
5 марта 2012 г.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Разбор задач.
Задача 1. Написать класс Прямоугольник — наследник
Polygon. Определить в нём метод подсчёта площади.
Проверить корректность его работы.
Самым простым способом подсчёта площади является
перемножение длинной стороны прямоугольника на
короткую. Данные о сторонах мы имеем в свойстве sides,
поэтому задача становится весьма несложной.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Задача 1
Listing 1: Задача 1
c l a s s Polygon
. . .
end
c l a s s Rectangle < Polygon
def square
@square = @sides [ 0 ] ∗ @sides [ 1 ]
end
end
r = Rectangle . new
r . s i d e s = [10 ,2 ,10 ,2]
puts r . square
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Задача 2
Задача 2. Написать в классе Прямоугольник метод,
определяющий, является ли прямоугольник квадратом.
Метод должен возвращать булевский ответ. Проверить
корректность работы метода.
Вспомним, что булевский ответ — это истина или ложь. В
качестве правил хорошего тона булевские методы следует
оканчивать на знак вопроса.
Назовём наш метод square?.
Алгоритм: прямоугольник является квадратом, когда все
его углы и стороны равны между собой. Достаточно
проверить три угла, так как чётвёртый получается
вычитанием из 360.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Решение задачи 2
Listing 2: Задача 2
c l a s s Rectangle < Polygon
. . .
def square ?
i f ( ( @sides [ 0 ] == @sides [ 1 ] ) &&
( @sides [ 1 ] == @sides [ 2 ] ) &&
( @sides [ 2 ] == @sides [ 3 ] ) &&
( @corners [ 0 ] == 90) &&
( @corners [ 1 ] == 90) &&
( @corners [ 2 ] == 90)
)
true
e l s e
f a l s e
end
end
end
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Задача 3
Задача 3. Создать в классе Треугольник метод,
проверяющий, является ли данный треугольник
прямоугольным. Проверить корректность работы метода.
Алгоритм: треугольник является прямоугольным, если
выполнено условие теоремы Пифагора: сумма квадратов
катетов равна квадрату гипотенузы.
Для быстрого определения, какая сторона самая большая,
используем метод sort для массива сторон.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Решение задачи 3
Listing 3: Задача 3
c l a s s T r i a n g l e < Polygon
. . .
def r e c t a n g u l a r ?
s i d e s = @sides . s o r t
i f ( s i d e s [2]∗∗2 == ( s i d e s [0]∗∗ 2 + s i d e s [ 1 ] ∗ ∗ 2 ) )
true
e l s e
f a l s e
end
end
. . .
end
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Три кита ООП
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Инкапсуляция
Наследование
Полиморфизм
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Инкапсуляция
Наследование
Полиморфизм
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Инкапсуляция
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Инкапсуляция
Объектно–ориентированное программирование позволяет
использовать парадигму чёрного ящика для сокрытия
логики приложения.
Написав однажды какой-либо метод, нет смысла
впоследствии вникать в его содержимое.
Более того, другие программисты могут вообще не знать
реализацию конкретного метода, но вполне уметь его
использовать.
Такой подход в объектно-ориентированном
программировании называется инкапсуляция.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Пример с уравнением ax + b = c
Listing 4: Инкапсуляция
c l a s s LinearEquation
a t t r_ a c c e s s o r : a , : b , : c
def i n i t i a l i z e (a , b , c )
@a = a
@b = b
@c = c
end
def s o l v e
i f (@a == 0)
return "any" i f (@b == @c)
return "no␣ s o l u t i o n s "
e l s e
x = (@c − @b) / @a
end
end
end
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Разбор кода
В этом коде были использованы несколько новых
конструкций. Вы можете его не понимать. Но самое
важное — он работает, а, значит, в соответствии с
принципом инкапсуляции (в данном случае — сокрытия)
вы можете его использовать.
Например, решим уравнение: 2x - 4 = 6.
Listing 5: Используем код
eq = LinearEquation . new (2 , −4, 6)
puts eq . s o l v e
Итого: инкапсуляция позволяет использовать любой код без необходимости
понимать, как оно устроено внутри.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Конструкторы
В классе LinearEquation мы использовали неизвестный нам
ранее метод initialize.
Это — специальный метод. Он называется конструктор.
Конструктор — это метод, который вызывается при
создании нового объекта.
Конструкторы используются для автоматизации задач,
которые нужно выполнить при создании объекта.
В нашем примере мы сразу в конструктор передаём
исходные данные задачи, чтобы не “забивать” их вручную.
Для передачи данных в конструктор мы в метод new
передаём нужные параметры.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Дополнительно об инкапсуляции
Помимо уже рассмотреного, одной из возможностей
инкапсуляции является сокрытие методов.
Не вдаваясь сейчас в подробности, укажем, что
существуют три возможных видимости методов:
1 Публичный метод
2 Приватный метод
3 Защищённый метод
Идея инкапсуляции заключается в сокрытии с помощью
видимости тех методов, к которым нежелательно давать
доступ программисту. Это позволяет уменьшить
количество ошибок в программе.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Полиморфизм
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Полиморфизм
Рассмотрим класс Человек. У класса Человек есть
свойства фамилия, имя, отчество и метод обратиться по
имени.
К большинству людей в России принято обращаться по
имени–отчеству.
Однако к школьникам, обычно, обращаются по имени.
Итого, один и тот же метод для разных классов имеет
разные реализации.
Возможность похожих классов (например, наследников)
иметь различную реализацию одного и того же метода
называется полиморфизмом.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Пример полиморфизма
Listing 6: Полиморфизм
c l a s s Person
a t t r_ a c c e s s o r : first_name , : last_name , : middle_name , : j
def getName
@first_name + ’ ␣ ’ + @middle_name
end
end
c l a s s Teacher < Person
end
c l a s s Student < Person
def getName
@first_name
end
end
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Polizei
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание 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 . new
puts p . getName
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Для чего нужен полиморфизм?
С помощью полиморфизма можно переопределять методы
родительского класса.
Часто имеется следующая ситуация: в 90% случаев
методы наследников полностью идентичны. В этом случае
общий метод выносят в класс–родитель, чтобы не
дублировать код.
Однако в 10% случаев есть необходимость по-другому
реализовать метод.
Чтобы не вставлять в метод проверки и условия,
используют полиморфизм, переопределяя метод только
там, где нужно.
Самостоятельное изучение. Перегрузка методов,
перегрузка / переопределение операций.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Конструкторы при полиморфизме
В созданном классе «Учитель» мы можем автоматически
проставлять свойство job.
Это проще всего сделать с помощью конструктора.
Listing 8: Конструктор в полиморфизме
c l a s s Teacher < Person
def i n i t i a l i z e
@job = " Teacher "
end
end
t = Teacher . new
puts t . job
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Конструктор родителя
А что делать, если мы хотим вызвать и конструктор
родителя, и текущий? Ведь если мы переопределяем с
помощью полиморфизма метод initialize, то “старый”
забывается.
Для этого в ruby есть специальный метод super.
Простой вызов этого метода вызовет конструктор
родителя.
Разумеется, в метод super можно передавать аргументы.
В предложенном на следующем слайде примере код
выведет на экран две строчки: «B», «A».
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Код конструктора родителя
Listing 9: Конструктор родителя
c l a s s A
def i n i t i a l i z e ( l a b e l )
puts l a b e l
end
end
c l a s s B < A
def i n i t i a l i z e
puts "B"
super ( "A" )
end
end
b = B. new
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Задание
Создать следующие классы: человек, ученик,
ученик–раздолбай, учитель, директор.
Каждый человек имеет: фамилию, имя, отчество, год
рождения. Наследование определено в соответствии со
здравым смыслом (ученик–раздолбай — наследник
ученика). Все сущности имеют методы:
1 Посчитать возраст (getAges).
2 обратиться по имени (getName) по правилу: учитель и
директор — имя + отчество, ученик — имя,
ученик-раздолбай — “Бяка” + имя.
3 булевский метод главный (head?): для директора
возвращается истина, для остальных — ложь.
ФИО и год рождения должно задаваться в конструкторе.
После реализации создать экземпляры каждого класса и
вызвать для них методы getName, getAges, head?.
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание References
Сложное задание
Реализовать класс Двумерный Вектор.
Класс имеет два свойства: x-компонента, y-компонента.
Методы класса:
1 посчитать длину (модуль)
2 прибавить к текущему вектору другой
3 отнять от текущего вектора другой
4 изменить знак вектора (-вектор)
5 умножить вектор на скаляр (вещественное число)
6 скалярно умножить на другой вектор
Информатика 10-11 классы Инкапсуляция и полиформизм
Разбор задач Инкапсуляция Полиморфизм Задание 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!
Вопросы, предложения, д/з: smirik@gmail.com
Информатика 10-11 классы Инкапсуляция и полиформизм

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

  • 1.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Инкапсуляция и полиформизм Информатика 10-11 классы 5 марта 2012 г. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 2.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Разбор задач. Задача 1. Написать класс Прямоугольник — наследник Polygon. Определить в нём метод подсчёта площади. Проверить корректность его работы. Самым простым способом подсчёта площади является перемножение длинной стороны прямоугольника на короткую. Данные о сторонах мы имеем в свойстве sides, поэтому задача становится весьма несложной. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 3.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Задача 1 Listing 1: Задача 1 c l a s s Polygon . . . end c l a s s Rectangle < Polygon def square @square = @sides [ 0 ] ∗ @sides [ 1 ] end end r = Rectangle . new r . s i d e s = [10 ,2 ,10 ,2] puts r . square Информатика 10-11 классы Инкапсуляция и полиформизм
  • 4.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Задача 2 Задача 2. Написать в классе Прямоугольник метод, определяющий, является ли прямоугольник квадратом. Метод должен возвращать булевский ответ. Проверить корректность работы метода. Вспомним, что булевский ответ — это истина или ложь. В качестве правил хорошего тона булевские методы следует оканчивать на знак вопроса. Назовём наш метод square?. Алгоритм: прямоугольник является квадратом, когда все его углы и стороны равны между собой. Достаточно проверить три угла, так как чётвёртый получается вычитанием из 360. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 5.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Решение задачи 2 Listing 2: Задача 2 c l a s s Rectangle < Polygon . . . def square ? i f ( ( @sides [ 0 ] == @sides [ 1 ] ) && ( @sides [ 1 ] == @sides [ 2 ] ) && ( @sides [ 2 ] == @sides [ 3 ] ) && ( @corners [ 0 ] == 90) && ( @corners [ 1 ] == 90) && ( @corners [ 2 ] == 90) ) true e l s e f a l s e end end end Информатика 10-11 классы Инкапсуляция и полиформизм
  • 6.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Задача 3 Задача 3. Создать в классе Треугольник метод, проверяющий, является ли данный треугольник прямоугольным. Проверить корректность работы метода. Алгоритм: треугольник является прямоугольным, если выполнено условие теоремы Пифагора: сумма квадратов катетов равна квадрату гипотенузы. Для быстрого определения, какая сторона самая большая, используем метод sort для массива сторон. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 7.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Решение задачи 3 Listing 3: Задача 3 c l a s s T r i a n g l e < Polygon . . . def r e c t a n g u l a r ? s i d e s = @sides . s o r t i f ( s i d e s [2]∗∗2 == ( s i d e s [0]∗∗ 2 + s i d e s [ 1 ] ∗ ∗ 2 ) ) true e l s e f a l s e end end . . . end Информатика 10-11 классы Инкапсуляция и полиформизм
  • 8.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Три кита ООП Информатика 10-11 классы Инкапсуляция и полиформизм
  • 9.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Инкапсуляция Наследование Полиморфизм Информатика 10-11 классы Инкапсуляция и полиформизм
  • 10.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Инкапсуляция Наследование Полиморфизм Информатика 10-11 классы Инкапсуляция и полиформизм
  • 11.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Инкапсуляция Информатика 10-11 классы Инкапсуляция и полиформизм
  • 12.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Инкапсуляция Объектно–ориентированное программирование позволяет использовать парадигму чёрного ящика для сокрытия логики приложения. Написав однажды какой-либо метод, нет смысла впоследствии вникать в его содержимое. Более того, другие программисты могут вообще не знать реализацию конкретного метода, но вполне уметь его использовать. Такой подход в объектно-ориентированном программировании называется инкапсуляция. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 13.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Пример с уравнением ax + b = c Listing 4: Инкапсуляция c l a s s LinearEquation a t t r_ a c c e s s o r : a , : b , : c def i n i t i a l i z e (a , b , c ) @a = a @b = b @c = c end def s o l v e i f (@a == 0) return "any" i f (@b == @c) return "no␣ s o l u t i o n s " e l s e x = (@c − @b) / @a end end end Информатика 10-11 классы Инкапсуляция и полиформизм
  • 14.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Разбор кода В этом коде были использованы несколько новых конструкций. Вы можете его не понимать. Но самое важное — он работает, а, значит, в соответствии с принципом инкапсуляции (в данном случае — сокрытия) вы можете его использовать. Например, решим уравнение: 2x - 4 = 6. Listing 5: Используем код eq = LinearEquation . new (2 , −4, 6) puts eq . s o l v e Итого: инкапсуляция позволяет использовать любой код без необходимости понимать, как оно устроено внутри. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 15.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Конструкторы В классе LinearEquation мы использовали неизвестный нам ранее метод initialize. Это — специальный метод. Он называется конструктор. Конструктор — это метод, который вызывается при создании нового объекта. Конструкторы используются для автоматизации задач, которые нужно выполнить при создании объекта. В нашем примере мы сразу в конструктор передаём исходные данные задачи, чтобы не “забивать” их вручную. Для передачи данных в конструктор мы в метод new передаём нужные параметры. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 16.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Дополнительно об инкапсуляции Помимо уже рассмотреного, одной из возможностей инкапсуляции является сокрытие методов. Не вдаваясь сейчас в подробности, укажем, что существуют три возможных видимости методов: 1 Публичный метод 2 Приватный метод 3 Защищённый метод Идея инкапсуляции заключается в сокрытии с помощью видимости тех методов, к которым нежелательно давать доступ программисту. Это позволяет уменьшить количество ошибок в программе. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 17.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Полиморфизм Информатика 10-11 классы Инкапсуляция и полиформизм
  • 18.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Полиморфизм Рассмотрим класс Человек. У класса Человек есть свойства фамилия, имя, отчество и метод обратиться по имени. К большинству людей в России принято обращаться по имени–отчеству. Однако к школьникам, обычно, обращаются по имени. Итого, один и тот же метод для разных классов имеет разные реализации. Возможность похожих классов (например, наследников) иметь различную реализацию одного и того же метода называется полиморфизмом. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 19.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Пример полиморфизма Listing 6: Полиморфизм c l a s s Person a t t r_ a c c e s s o r : first_name , : last_name , : middle_name , : j def getName @first_name + ’ ␣ ’ + @middle_name end end c l a s s Teacher < Person end c l a s s Student < Person def getName @first_name end end Информатика 10-11 классы Инкапсуляция и полиформизм
  • 20.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Polizei Информатика 10-11 классы Инкапсуляция и полиформизм
  • 21.
    Разбор задач ИнкапсуляцияПолиморфизм Задание 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 . new puts p . getName Информатика 10-11 классы Инкапсуляция и полиформизм
  • 22.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Для чего нужен полиморфизм? С помощью полиморфизма можно переопределять методы родительского класса. Часто имеется следующая ситуация: в 90% случаев методы наследников полностью идентичны. В этом случае общий метод выносят в класс–родитель, чтобы не дублировать код. Однако в 10% случаев есть необходимость по-другому реализовать метод. Чтобы не вставлять в метод проверки и условия, используют полиморфизм, переопределяя метод только там, где нужно. Самостоятельное изучение. Перегрузка методов, перегрузка / переопределение операций. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 23.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Конструкторы при полиморфизме В созданном классе «Учитель» мы можем автоматически проставлять свойство job. Это проще всего сделать с помощью конструктора. Listing 8: Конструктор в полиморфизме c l a s s Teacher < Person def i n i t i a l i z e @job = " Teacher " end end t = Teacher . new puts t . job Информатика 10-11 классы Инкапсуляция и полиформизм
  • 24.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Конструктор родителя А что делать, если мы хотим вызвать и конструктор родителя, и текущий? Ведь если мы переопределяем с помощью полиморфизма метод initialize, то “старый” забывается. Для этого в ruby есть специальный метод super. Простой вызов этого метода вызовет конструктор родителя. Разумеется, в метод super можно передавать аргументы. В предложенном на следующем слайде примере код выведет на экран две строчки: «B», «A». Информатика 10-11 классы Инкапсуляция и полиформизм
  • 25.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Код конструктора родителя Listing 9: Конструктор родителя c l a s s A def i n i t i a l i z e ( l a b e l ) puts l a b e l end end c l a s s B < A def i n i t i a l i z e puts "B" super ( "A" ) end end b = B. new Информатика 10-11 классы Инкапсуляция и полиформизм
  • 26.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Задание Создать следующие классы: человек, ученик, ученик–раздолбай, учитель, директор. Каждый человек имеет: фамилию, имя, отчество, год рождения. Наследование определено в соответствии со здравым смыслом (ученик–раздолбай — наследник ученика). Все сущности имеют методы: 1 Посчитать возраст (getAges). 2 обратиться по имени (getName) по правилу: учитель и директор — имя + отчество, ученик — имя, ученик-раздолбай — “Бяка” + имя. 3 булевский метод главный (head?): для директора возвращается истина, для остальных — ложь. ФИО и год рождения должно задаваться в конструкторе. После реализации создать экземпляры каждого класса и вызвать для них методы getName, getAges, head?. Информатика 10-11 классы Инкапсуляция и полиформизм
  • 27.
    Разбор задач ИнкапсуляцияПолиморфизм Задание References Сложное задание Реализовать класс Двумерный Вектор. Класс имеет два свойства: x-компонента, y-компонента. Методы класса: 1 посчитать длину (модуль) 2 прибавить к текущему вектору другой 3 отнять от текущего вектора другой 4 изменить знак вектора (-вектор) 5 умножить вектор на скаляр (вещественное число) 6 скалярно умножить на другой вектор Информатика 10-11 классы Инкапсуляция и полиформизм
  • 28.
    Разбор задач ИнкапсуляцияПолиморфизм Задание 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! Вопросы, предложения, д/з: smirik@gmail.com Информатика 10-11 классы Инкапсуляция и полиформизм