Основы программирования — второй семестр 08-09; Михалкович С.С.; VIII часть — различия между версиями
Juliet (обсуждение | вклад) (Новая: == Полиморфизм и виртуальные методы == === Вводные понятия === === Позднее связывание и виртуальные методы ...) |
Juliet (обсуждение | вклад) (→Вводные понятия) |
||
Строка 1: | Строка 1: | ||
== Полиморфизм и виртуальные методы == | == Полиморфизм и виртуальные методы == | ||
=== Вводные понятия === | === Вводные понятия === | ||
+ | '''Инкапсуляция''' — хранение в классе одновременно данных и методов (класс представляет собой «капсулу»). <br /> | ||
+ | Инкапсуляция тесно связана с защитой данных: лишь некоторые члены в этой «капсуле» являются открытыми. | ||
+ | |||
+ | '''Полиморфизм''' — это, дословно, многообразие форм. <br /> | ||
+ | Более точно, '''полиморфизм''' — это способность родственных классов выполнять одинаковые действия сходным образом. | ||
+ | |||
+ | ''<u>Пример</u>.'' <br /> | ||
+ | Есть класс | ||
+ | '''Студент''' | ||
+ | Готовиться_к_экзамену() | ||
+ | И два его наследника: | ||
+ | '''Хороший_студент''' | ||
+ | Готовиться_к_экзамену() | ||
+ | и | ||
+ | '''Плохой студент''' | ||
+ | Готовиться_к_экзамену() | ||
+ | Действие <tt>Готовиться_к_экзамену()</tt> они выполняют по-разному. | ||
+ | |||
+ | Рассмотрим следующий код: | ||
+ | <source lang="Delphi"> | ||
+ | var p: Person; | ||
+ | p := new Student('Иванов', 17, 1, 11); | ||
+ | p.Print(); | ||
+ | </source> | ||
+ | |||
+ | <u>Вопрос</u>: какой метод <tt>Print</tt> вызовется? <br /> | ||
+ | <u>Ответ</u>: В разных языках программирования вызовутся <tt>Print</tt> разных классов: | ||
+ | :в таких языках, как ''Java'', ''Eiffel'' — <tt>'''Student'''.Print</tt>, <br />а в ''C++'', ''C#'', ''PasacalABC.NET'' — <tt>'''Person'''.Print</tt>. | ||
+ | |||
+ | Т.о. в ''PascalABC.NET'' вызовется метод <tt>Person.Print</tt>, но, хотелось бы, чтобы вызывался метод <tt>Student.Print</tt>. | ||
+ | |||
+ | Если решение о том, какой метод вызывать, принимается на этапе ''компиляции'' (<u>рано</u>), то связывание имени метода с конкретным кодом называется '''ранним связыванием'''. | ||
+ | |||
+ | Если же решение о том, какой метод вызывать, принимается на этапе ''выполнения программы'' (<u>поздно</u>), то связывание имени метода с конкретным кодом называется '''поздним связыванием'''. <br /> | ||
+ | Позднее связывание осущесвляется с методом того класса, на который ссылается переменная в процессе выполнения программы. | ||
+ | |||
+ | Итак, в ''PascalABC.NET'' по умолчанию реализовано '''''раннее связывание'''''. | ||
=== Позднее связывание и виртуальные методы === | === Позднее связывание и виртуальные методы === |
Версия 15:03, 21 мая 2009
Содержание
- 1 Полиморфизм и виртуальные методы
- 1.1 Вводные понятия
- 1.2 Позднее связывание и виртуальные методы
- 1.3 Виртуальные методы как блоки замены кода
- 1.4 Класс Object — неявный предок всех классов .NET
- 1.5 Переопределение методов Equals и ToString в классах Person и Student
- 1.6 Цепочка виртуальности и её разрыв
- 1.7 Алгоритм поиска в цепочке виртуальности
Полиморфизм и виртуальные методы
Вводные понятия
Инкапсуляция — хранение в классе одновременно данных и методов (класс представляет собой «капсулу»).
Инкапсуляция тесно связана с защитой данных: лишь некоторые члены в этой «капсуле» являются открытыми.
Полиморфизм — это, дословно, многообразие форм.
Более точно, полиморфизм — это способность родственных классов выполнять одинаковые действия сходным образом.
Пример.
Есть класс
Студент Готовиться_к_экзамену()
И два его наследника:
Хороший_студент Готовиться_к_экзамену()
и
Плохой студент Готовиться_к_экзамену()
Действие Готовиться_к_экзамену() они выполняют по-разному.
Рассмотрим следующий код:
var p: Person;
p := new Student('Иванов', 17, 1, 11);
p.Print();
Вопрос: какой метод Print вызовется?
Ответ: В разных языках программирования вызовутся Print разных классов:
- в таких языках, как Java, Eiffel — Student.Print,
а в C++, C#, PasacalABC.NET — Person.Print.
Т.о. в PascalABC.NET вызовется метод Person.Print, но, хотелось бы, чтобы вызывался метод Student.Print.
Если решение о том, какой метод вызывать, принимается на этапе компиляции (рано), то связывание имени метода с конкретным кодом называется ранним связыванием.
Если же решение о том, какой метод вызывать, принимается на этапе выполнения программы (поздно), то связывание имени метода с конкретным кодом называется поздним связыванием.
Позднее связывание осущесвляется с методом того класса, на который ссылается переменная в процессе выполнения программы.
Итак, в PascalABC.NET по умолчанию реализовано раннее связывание.