Наследование и полиморфизм реферат

Обновлено: 04.07.2024

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

Для этого я постарался на более-менее живых примерах объяснить базовые понятия ООП (класс, объект, интерфейс, абстракция, инкапсуляция, наследование и полиморфизм).

Первая часть посвящена классам, объектам и интерфейсам.
Вторая часть, представленная ниже, иллюстрирует инкапсуляцию, полиморфизм и наследование

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

Представим на минутку, что мы оказались в конце позапрошлого века, когда Генри Форд ещё не придумал конвейер, а первые попытки создать автомобиль сталкивались с критикой властей по поводу того, что эти коптящие монстры загрязняют воздух и пугают лошадей. Представим, что для управления первым паровым автомобилем необходимо было знать, как устроен паровой котёл, постоянно подбрасывать уголь, следить за температурой, уровнем воды. При этом для поворота колёс использовать два рычага, каждый из которых поворачивает одно колесо в отдельности. Думаю, можно согласиться с тем, что вождение автомобиля того времени было весьма неудобным и трудным занятием.

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

Инкапсуляция – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали
реализации от пользователя.

Инкапсуляция неразрывно связана с понятием интерфейса класса. По сути, всё то, что не входит в интерфейс, инкапсулируется в классе.

Абстракция

Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерён в коробке передач или влияния формы кузова на скорость (разве что, автомобиль стоит в глухой пробке и водителю абсолютно нечем заняться). Однако, руль, педали, указатель поворота (ну и, возможно, пепельницу) он будет использовать регулярно.

Абстрагирование – это способ выделить набор значимых характеристик объекта, исключая из рассмотрения незначимые. Соответственно, абстракция – это набор всех таких характеристик.

Если бы для моделирования поведения автомобиля приходилось учитывать химический состав краски кузова и удельную теплоёмкость лампочки подсветки номеров, мы никогда бы не узнали, что такое NFS.

Полиморфизм

Любое обучение вождению не имело бы смысла, если бы человек, научившийся водить, скажем, ВАЗ 2106 не мог потом водить ВАЗ 2110 или BMW X3. С другой стороны, трудно представить человека, который смог бы нормально управлять автомобилем, в котором педаль газа находится левее педали тормоза, а вместо руля – джойстик.

Всё дело в том, что основные элементы управления автомобиля имеют одну и ту же конструкцию и принцип действия. Водитель точно знает, что для того, чтобы повернуть налево, он должен повернуть руль, независимо от того, есть там гидроусилитель или нет.
Если человеку надо доехать с работы до дома, то он сядет за руль автомобиля и будет выполнять одни и те же действия, независимо от того, какой именно тип автомобиля он использует. По сути, можно сказать, что все автомобили имеют один и тот же интерфейс, а водитель, абстрагируясь от сущности автомобиля, работает именно с этим интерфейсом. Если водителю предстоит ехать по немецкому автобану, он, вероятно выберет быстрый автомобиль с низкой посадкой, а если предстоит возвращаться из отдалённого маральника в Горном Алтае после дождя, скорее всего, будет выбран УАЗ с армейскими мостами. Но, независимо от того, каким образом будет реализовываться движение и внутреннее функционирование машины, интерфейс останется прежним.

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.

Например, если вы читаете данные из файла, то, очевидно, в классе, реализующем файловый поток, будет присутствовать метод похожий на следующий: byte[] readBytes( int n );
Предположим теперь, что вам необходимо считывать те же данные из сокета. В классе, реализующем сокет, также будет присутствовать метод readBytes. Достаточно заменить в вашей системе объект одного класса на объект другого класса, и результат будет достигнут.

При этом логика системы может быть реализована независимо от того, будут ли данные прочитаны из файла или получены по сети. Таким образом, мы абстрагируемся от конкретной специализации получения данных и работаем на уровне интерфейса. Единственное требование при этом – чтобы каждый используемый объект имел метод readBytes.

Наследование

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

Нам необходимо выпустить целый модельный ряд автомобилей: седан, универсал и малолитражный хэтч-бэк. Очевидно, что мы не собираемся проектировать новый автомобиль с нуля, а, взяв за основу предыдущее поколение, внесём ряд конструктивных изменений. Например, добавим гидроусилитель руля и уменьшим зазоры между крыльями и крышкой капота, поставим противотуманные фонари. Кроме того, в каждой модели будет изменена форма кузова.

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

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

Действительно, в нашем примере мы могли бы произвести с новыми автомобилями все те же действия, что и со старым: увеличить или уменьшить скорость, повернуть, включить сигнал поворота. Однако, дополнительно у нас бы появилась возможность, например, включить противотуманные фонари.

Отсутствие обратной совместимости означает, что мы не должны ожидать от старой модели корректной реакции на такие действия, как включения противотуманок (которых просто нет в данной модели).

Переопределение метода внутри одного класса. Сущность перегрузки унаследованного метода. Области применения абстрактного класса. Перегрузка унарных и бинарных операций. Области видимости локальных и глобальных переменных. Способы обращения к ним.

Рубрика Программирование, компьютеры и кибернетика
Вид презентация
Язык русский
Дата добавления 09.12.2013
Размер файла 81,2 K

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

HTML-версии работы пока нет.
Cкачать архив работы можно перейдя по ссылке, которая находятся ниже.

Подобные документы

Понятие перегрузки (доопределения) операций и её разновидности. Пример соответствующей программы перегрузки, понятие полиморфизма и правила isA. Использование классов операторов в программах языка С++, конструкций операторов и производных классов.

реферат [19,9 K], добавлен 30.10.2011

Общие сведения о функциях, их структура. Области видимости и классы памяти переменных в функциях. Классификация видов памяти, выделяемой под переменные и константы. Примеры объявления глобальных и локальных переменных. Обращение к функции и ее прототип.

презентация [64,6 K], добавлен 09.12.2013

Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).

курсовая работа [29,7 K], добавлен 29.10.2011

Понятие доступности элементов класса и объекта. Обращение к полям на основе общедоступных свойств (инкапсуляция на основе свойств класса). Способы передачи данных в метод и возвращения результатов работы метода. Обращение к полям и свойствам класса.

презентация [86,6 K], добавлен 09.12.2013

Объектно-ориентированное программирование как методология программирования, опирающаяся на инкапсуляции, полиморфизме и наследовании. Общая форма класса. Наследование как процесс, посредством которого один объект получает свойства другого объекта.

презентация [214,9 K], добавлен 26.10.2013

Сущность и история развития объектно-ориентированного программирования. Наследование как важнейшее свойство объекта. Экземпляры объектных типов. Поля объектов, методы, полиморфизм. Производительность объектных программ. Пример программного продукта.

курсовая работа [33,3 K], добавлен 25.03.2012

Что такое класс в объектно-ориентированном программировании. Какую структуру имеет модуль в С++. Какими средствами осуществляется консольный ввод данных в языке Си, С++. Инкапсуляция, полиморфизм, наследование. Использование библиотеки " ".

Полиморфизм — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, инкапсуляцией и наследованием).
Полиморфизм позволяет писать более абстрактные программы и повысить коэффициент повторного использования кода.
Общие свойства объектов объединяются всистему, которую могут называть по-разному — интерфейс, класс. Общность имеет внешнее и внутреннее выражение:
▪ внешняя общность проявляется как одинаковый набор методов с одинаковыми именами и сигнатурами (именем методов и типами аргументов и их количеством);
▪ внутренняя общность — одинаковая функциональность методов. Её можно описать интуитивно или выразить в виде строгих законов,правил, которым должны подчиняться методы. Возможность приписывать разную функциональность одному методу (функции, операции) называется перегрузкой метода (перегрузкой функций, перегрузкой операций).
Примеры

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

В объектно-ориентированных языках

В объектно-ориентированных языках класс является абстрактным типом данных. Полиморфизм реализуется с помощью наследования классови виртуальных функций. Класс-потомок наследует сигнатуры методов класса-родителя, а реализация, в результате переопределения метода, этих методов может быть другой, соответствующей специфике класса-потомка. Другие функции могут работать с объектом как с экземпляром класса-родителя, но если при этом объект на самом деле является экземпляром класса-потомка, то во время исполнения будет вызван метод, переопределенный вклассе-потомке. Это называется поздним связыванием. [Примером использования может служить обработка массива, содержащего экземпляры как класса-родителя, так и класса-потомка: очевидно, что такой массив может быть объявлен только как массив типа класса-родителя и у объектов массива могут вызываться только методы этого класса, но если в классе-потомке какие-то методы были переопределены, то в режиме исполнениядля экземпляров этого класса будут вызваны именно они, а не методы класса-родителя.]
Класс-потомок сам может быть родителем. Это позволяет строить сложные схемы наследования — древовидные или сетевидные.
Абстрактные (или чисто виртуальные) методы не имеют реализации вообще (на самом деле некоторые языки, например C++, допускают реализацию абстрактных методов в родительском классе).Они специально предназначены для наследования. Их реализация должна быть определена в классах-потомках.
Класс может наследовать функциональность от нескольких классов. Это называется множественным наследованием. Множественное наследование создаёт известную проблему (в C++), когда класс наследуется от нескольких классов-посредников.

Мне сегодня был представлен этот вопрос в конце экзамена по открытой книге модуля, и я оказался потерянным. Я читал Head first Java , и оба определения были точно такими же. Я просто задавался вопросом, что главное для моего разума. Я знаю, что есть ряд подобных вопросов, но я не видел, что дает окончательный ответ.

ОТВЕТЫ

Ответ 1

Наследование - это когда "класс" происходит от существующего "класса". Поэтому, если у вас есть класс Person , то у вас есть класс Student , который расширяет Person , Student наследует все, что имеет Person . Есть некоторые детали вокруг модификаторов доступа, которые вы помещаете в поля/методы в Person, но это основная идея. Например, если у вас есть частное поле в Person , Student не увидит его, потому что его частные и частные поля не видны для подклассов.

Полиморфизм имеет дело с тем, как программа решает, какие методы она должна использовать, в зависимости от того, что она имеет. Если у вас есть Person , у которого есть метод read , и у вас есть Student , который расширяет Person , у которого есть своя реализация read , вызываемый метод определяется для вас средой выполнения, если у вас есть Person или Student . Это немного сложно, но если вы делаете что-то вроде

вызывается метод чтения на Student. Это полиморфизм в действии. Вы можете выполнить это назначение, потому что Student - это Person , но среда выполнения достаточно умна, чтобы знать, что фактическим типом p является Student.

Обратите внимание, что детали отличаются друг от друга. Например, вы можете наследовать в javascript, но это совершенно не так, как в Java.

Ответ 2

Наследование относится к использованию структуры и поведения суперкласса в подклассе.

Полиморфизм относится к изменению поведения суперкласса в подклассе.

Ответ 3

Полиморфизм. Способность обрабатывать объекты разных типов аналогичным образом. Пример: Жираф и крокодил - это животные, а животные могут Move . Если у вас есть экземпляр Animal , тогда вы можете позвонить Move , не зная или не заботясь о том, какой тип животного он имеет.

Наследование. Это один из способов одновременного использования полиморфизма и повторного использования кода.

Другие формы полиморфизма: Существуют и другие способы достижения полиморфизма, такие как интерфейсы, которые обеспечивают только полиморфизм, но не используют повторное использование кода (иногда код совсем другой, например, Move для Змеи будет сильно отличаться от Move для собаки, в которой В этом случае интерфейс будет лучшим полиморфным выбором.

В других динамических языках полиморфизм может быть достигнут с помощью Duck Typing, для которого классам не требуется разделять один и тот же базовый класс или интерфейс, им просто нужен метод с тем же именем. Или даже более динамичный, как Javascript, вам даже не нужны классы вообще, только объект с тем же именем метода может использоваться полиморфно.

Ответ 4

Основное различие заключается в том, что полиморфизм является конкретным результатом наследования. Полиморфизм - это то, где метод, который должен быть вызван, определяется во время выполнения на основе типа объекта. Это ситуация, которая возникает, когда у вас есть один класс, наследующий от другого и переопределяющий конкретный метод. Однако в обычном дереве наследования вам не нужно переопределять какие-либо методы, и поэтому не все вызовы методов должны быть полиморфными. Имеет ли это смысл? Это аналогичная проблема для всех автомобилей Ford - это автомобили, но не все автомобили - это Форды (хотя и не совсем. ).

Кроме того, полиморфизм имеет дело с вызовом метода, тогда как наследование также описывает члены данных и т.д.

Ответ 5

В Java эти два тесно связаны. Это связано с тем, что Java использует метод вызова метода, называемый "динамическая отправка". Если у меня есть

Затем мы видим, что B наследует spin от A. Однако, когда мы пытаемся манипулировать объектом, как если бы это был тип A, мы по-прежнему получаем поведение B для draw . Поведение draw является полиморфным.

В некоторых языках полиморфизм и наследование не так тесно связаны. В С++, например, функции, не объявленные виртуальными, наследуются, но не будут отправляться динамически, поэтому вы не получите этого полиморфного поведения, даже если вы используете наследование.

В javascript каждый вызов функции динамически отправляется, и у вас слабый ввод. Это означает, что у вас может быть куча несвязанных объектов, каждая из которых имеет свой собственный draw , функция выполняет итерацию по ним и вызывает функцию, и каждый из них будет вести себя отлично. У вас будет своя полиморфная ничья, не требующая наследования.

Ответ 6

Итак, это означает использование Наследования, которое является одним из способов достижения полиморфизма.

Полиморфизм может быть возможен в классе/интерфейсе, но наследование всегда между 2 или более классами/интерфейсами. Наследование всегда соответствует отношению "is-a", тогда как это не всегда с полиморфизмом (который может соответствовать как "is-a" / "has-a".

Ответ 7

Наследование больше статично (один класс расширяет другой), в то время как полиморфизм - это динамическое/время выполнения (объект ведет себя в соответствии с его типом dynamic/runtime, а не его статическим/объявлением).

- > Хотя статический/тип объявления a есть A, фактический тип динамического /runtime - это B и, следовательно, a.foo() выполнит foo, как определено в B, а не в A.

Ответ 8

Полиморфизм - это подход к выражению общего поведения между типами объектов, которые имеют сходные черты. Он также позволяет создавать вариации этих признаков посредством переопределения. Наследование - это способ достижения полиморфизма через иерархию объектов, где объекты выражают отношения и абстрактное поведение. Однако это не единственный способ добиться полиморфизма. Прототип - еще один способ выразить полиморфизм, отличный от наследования. JavaScript - пример языка, который использует прототип. Я бы предположил, что есть и другие способы.

Ответ 9

Документация Oracle точно указала разницу.

inheritance: Класс наследует поля и методы от всех своих суперклассов, будь то прямые или косвенные. Подкласс может переопределять методы, которые он наследует, или может скрывать поля или методы, которые он наследует. (Обратите внимание, что скрытие полей, как правило, плохое программирование.)

полиморфизм: полиморфизм относится к принципу в биологии, в котором организм или вид могут иметь много разных форм или этапов. Этот принцип также может быть применен к объектно-ориентированному программированию и языкам, таким как язык Java. Подклассы класса могут определять свое собственное уникальное поведение и совместно использовать одни и те же функциональные возможности родительского класса.

не применим для полей.

Ответ 10

Наследование - это концепция, связанная с повторным использованием кода. Например, если у меня есть родительский класс, скажите Animal и он содержит определенные атрибуты и методы (в этом примере говорят makeNoise() и sleep() ), и я создаю два дочерних класса, называемых Dog и Cat . Поскольку и собаки, и кошки переходят спать таким же образом (я бы предположил), нет необходимости добавлять больше функциональности методу sleep() в подклассы Dog и Cat , предоставляемые родительским классом Animal . Однако a Dog barks и a Cat мешают, хотя класс Animal может иметь способ шуметь, собака и кошка создают разные шумы относительно друг друга и других животных. Таким образом, необходимо переопределить это поведение для своих конкретных типов. Таким образом, определение полиморфизма. Надеюсь, это поможет.

Ответ 11

Наследование - это когда класс A наследует все нестатические защищенные/общедоступные методы/поля от всех его родителей до Object.

Ответ 12

Основная цель полиморфизма. Чтобы создать ссылочную переменную суперкласс и удерживая подкласс object = > , объект может выполнять множественное поведение.

В наследовании, подкласс наследует свойства суперкласса.

Ответ 13

Если вы используете JAVA, это так просто:

Полиморфизм использует унаследованные методы, но "переопределяет" их, чтобы делать что-то другое (или то же самое, если вы вызываете супер, поэтому технически не было бы полиморфным).

Исправьте меня, если я ошибаюсь.

Ответ 14

Наследование является своего рода полиморфизмом. На самом деле наследование - это динамический полиморфизм. Итак, когда вы удаляете наследование, вы больше не можете переопределять.

Ответ 15

Полиморфизм достигается наследованием в Java .

Класс Hamster наследует структуру от Animal , Herbivore и Pet чтобы продемонстрировать полиморфный бихевиоризм домашнего питомца.

Класс Cat наследует структуру от Animal , Carnivore и Pet чтобы также демонстрировать полиморфный бихевиоризм домашнего питомца.

Ответ 16

Полиморфизм - это эффект наследования. Это может происходить только в классах, расширяющих друг друга. Это позволяет вам вызывать методы класса, не зная точного типа класса. Кроме того, полиморфизм происходит во время выполнения.

Например, пример полиморфизма Java:

enter image description here

Наследование позволяет производным классам совместно использовать интерфейсы и код своих базовых классов. Это происходит во время компиляции.

Например, все классы в платформе Java являются потомками объекта (изображение любезно предоставлено Oracle):

Чтобы продемонстрировать механизм наследования классов рассмотрим несколько нарочито простых классов, которые будут описывать транспортные средства: автобус, такси, троллейбус и трамвай. Базовым классом у нас будет класс "траспортное средство", который мы определим следующим образом:

\begin<verbatim></p>
<p>class TTransport < protected int Speed; // скорость protected int Massa; // Масса protected int Payload; // грузоподъемность public TTransport(int Speed, int Massa, int Payload) < this.Speed = Speed; this.Massa = Massa; this.Payload = Payload; >public void Print() // распечатать информацию < Console.WriteLine(

Смысл этого класса хранить и распечатывать информации о транспортном средстве. Любое транспортное средство имеет такие характеристики как скорость, масса и грузоподъемность. Однако для автотранспорта есть еще дополнительные характеристики такие, как расход топлива, а у электротранспорта есть такая дополнительная характеристика как напряжение. Поэтому мы создадим еще два класса. С использованием технологии наследования. Наследование - это технология проектирования классов, позволяющая создавать новые классы на базе предыдущих классов. При этом классы наследники будут иметь все поля и методы родительского класса. А к тем полям и методам, которые имеют спецификатор доступа или , можно будет обращаться из наследного класса. Приведем определения этих классов:

\begin<verbatim></p>
<p>class TAuto : TTransport < protected int Petrol; // Расход бензина public TAuto(int Speed, int Massa, int Payload, int Petrol) : base(Speed, Massa, Payload) < this.Petrol = Petrol; >public void Print() < base.Print(); Console.WriteLine(

Разберем, как работает наследование класса. Чтобы указать, что класс является наследником класса , следует написать:

\begin</p>
<p>class B : A < . >\end

Теперь класс имеет все поля и методы класса . Однако поля и методы класса , имеющие классификатор доступа , будут недоступны для класса . Если в классе объявлены поля и методы, совпадающие с полями и методами класса , то они будут заменены, или как говорят - сокрыты соответствующими полями и методами класса . В нашем примере таким методом является метод . Если нам нужно из класса обратиться к полям или методам родительского класса , то для этого нужно использовать ключевое слово , аналогичное ключевому слову .

Если родительский класс имеет заданный конструктор , то он должен быть вызван из конструктора наследного класса. Обратите внимание, как можно вызывать конструктор родительского класса:

\begin</p>
<p>public TAuto(int Speed, int Massa, int Payload, int Petrol) : base(Speed, Massa, Payload) < . >\end

Попрактикуемся в создании классов наследников. Создадим два класса (автомобиль и такси) наследников от класса и два класса (трамвай и троллейбус) наследников от класса . У каждого нового класса могут быть дополнительные поля и методы, но мы для простоты не будем добавлять новых полей и методов.

\begin</p>
<p>class TBus : TAuto < public TBus(int Speed, int Massa, int Payload, int Petrol) : base(Speed, Massa, Payload, Petrol) < >> class TTaxi : TAuto < public TTaxi(int Speed, int Massa, int Payload, int Petrol) : base(Speed, Massa, Payload, Petrol) < >> class TTram : TElectro < public TTram(int Speed, int Massa, int Payload, int Voltage) : base(Speed, Massa, Payload, Voltage) < >> class TTroll : TElectro < public TTroll(int Speed, int Massa, int Payload, int Voltage) : base(Speed, Massa, Payload, Voltage) < >> \end

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

\begin</p>
<p>TTransport[] Trans; Trans = new TTransport[4]; Trans[0] = new TAuto(120, 5, 2, 60); Trans[1] = new TTaxi(250, 1, 1, 40); Trans[2] = new TTram(100, 7, 5, 3000); Trans[3] = new TTroll(80, 4, 2, 2500); \end

Заметим, что у нас в массиве все элементы из разных классов, хотя и родственники класса . Конечно, мы могли бы, перебирая массив , для каждого экземпляра класса подсчитать нужное соотношение. Но тут возникает проблема - ведь у половины классов нужно делить значение на значение , а у половины нужно делить значение на значение . Тем более, что идеология объектно-ориентированного программирования подразумевает, что классы сами должны обрабатывать собственные данные. Поэтому мы поступим следующим образом - мы добавим в наши классы метод . При этом мы воспользуемся технологией полиморфизма. Полиморфизм - это возможность объектов с одинаковой спецификацией иметь различную реализацию. Мы создадим у класса TTransport виртуальный метод :

\begin</p>
<p>class TTransport < . public virtual double Calc() < return 0; >> \end

Ключевое слово означает, что наследники данного класса смогут изменить код данного метода. Сейчас мы еще модифицируем у родительского класса метод следующим образом:

\begin<verbatim></p>
<p>public void Print() // распечатать информацию < Console.WriteLine(

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

\begin</p>
<p>class TAuto : TTransport < . public override double Calc() < return (double)Payload / (double)Petrol; >> class TElectro : TTransport < . public override double Calc() < return (double)Payload / (double)Voltage; >> \end

Теперь наша программа выдаст нужный результат:

\begin</p>
<p>Speed = 120 Massa = 5 Payload = 2 Calc Result = 0,0333333333333333 Speed = 250 Massa = 1 Payload = 1 Calc Result = 0,025 Speed = 100 Massa = 7 Payload = 5 Calc Result = 0,001666666666667 Speed = 80 Massa = 4 Payload = 2 Calc Result = 0,0008 \end

Чтобы оценить всю мощь полиморфизма, нужно обратить внимание, что метод вызывается в методе класса ! Ведь при наследовании мы можем и не иметь исходного текста класса , этот класс может быть доступен только в виде откомпилированной библиотекой. Тем не менее механизм полиморфизма позволяет нам модифицировать виртуальные методы. Мы будем использовать систематически полиморфизм при реализации вычислительных процедур.

Сделаем еще одно замечание. В родительском классе нам пришлось фиктивно реализовать метод , хотя с точки зрения проектирования это не очень правильно. Во-первых, плохо писать код только для того, чтобы он был, а, во-вторых, плохо писать неверный код: возвращать 0. К счастью, развитое объектно-ориентированное программирование позволяет создавать так называемые абстрактные классы. Абстрактные классы могут содержать абстрактные виртуальные методы. Абстрактный метод содержит только объявление, но не имеет реализации. Разумеется, абстрактный метод является виртуальным, но ключевое слово не пишется, чтобы в наследных классах можно было перекрыть этот метод. Более того, невозможно создать экземпляр абстрактного класса, а наследник абстрактного класса или сам должен быть абстрактным или обязан реализовать все абстрактные методы. Последний штрих к нашей программе:

\begin</p>
<p>abstract class TTransport < . public abstract double Calc(); >\end

Calc

Еще раз подчеркнем, что мы не привели в этом листинге реализацию метода не потому, чтобы сократить письмо , а потом что для абстрактного метода не бывает реализации.

Ключевые термины

Абстрактный класс - класс , содержащий нереализованные методы, которые необходимо реализовать в классах наследниках.

Наследование - технология проектирования классов, позволяющая создавать новые классы на базе предыдущих классов.

Полиморфизм - возможность объектов с одинаковой спецификацией иметь различную реализацию.

Читайте также: