Основы программирования — второй семестр 08-09; Михалкович С.С.; VIII часть — различия между версиями

Материал из Вики ИТ мехмата ЮФУ
Перейти к: навигация, поиск
(Новая: == Полиморфизм и виртуальные методы == === Вводные понятия === === Позднее связывание и виртуальные методы ...)
 
(Вводные понятия)
Строка 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

Полиморфизм и виртуальные методы

Вводные понятия

Инкапсуляция — хранение в классе одновременно данных и методов (класс представляет собой «капсулу»).
Инкапсуляция тесно связана с защитой данных: лишь некоторые члены в этой «капсуле» являются открытыми.

Полиморфизм — это, дословно, многообразие форм.
Более точно, полиморфизм — это способность родственных классов выполнять одинаковые действия сходным образом.

Пример.
Есть класс

Студент
    Готовиться_к_экзамену()

И два его наследника:

Хороший_студент
    Готовиться_к_экзамену()

и

Плохой студент
    Готовиться_к_экзамену()

Действие Готовиться_к_экзамену() они выполняют по-разному.

Рассмотрим следующий код:

var p: Person;
p := new Student('Иванов', 17, 1, 11);
p.Print();

Вопрос: какой метод Print вызовется?
Ответ: В разных языках программирования вызовутся Print разных классов:

в таких языках, как Java, EiffelStudent.Print,
а в C++, C#, PasacalABC.NETPerson.Print.

Т.о. в PascalABC.NET вызовется метод Person.Print, но, хотелось бы, чтобы вызывался метод Student.Print.

Если решение о том, какой метод вызывать, принимается на этапе компиляции (рано), то связывание имени метода с конкретным кодом называется ранним связыванием.

Если же решение о том, какой метод вызывать, принимается на этапе выполнения программы (поздно), то связывание имени метода с конкретным кодом называется поздним связыванием.
Позднее связывание осущесвляется с методом того класса, на который ссылается переменная в процессе выполнения программы.

Итак, в PascalABC.NET по умолчанию реализовано раннее связывание.

Позднее связывание и виртуальные методы

Виртуальные методы как блоки замены кода

Класс Object — неявный предок всех классов .NET

Переопределение методов Equals и ToString в классах Person и Student

Цепочка виртуальности и её разрыв

Алгоритм поиска в цепочке виртуальности