Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»

Презентация:



Advertisements
Похожие презентации
Наследование Наследование – это отношение является между классами. class Person { string first_name; int birth_year;... } class Student : Person { float.
Advertisements

Полиморфизм. Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Прикладное программирование кафедра прикладной и компьютерной оптики Наследование.
Наследование Полиморфизм ВЫЗОВ КОНСТРУКТОРОВ И ДЕСТРУКТОРОВ ПРИ НАСЛЕДОВАНИИ.
Полиморфизм Полиморфизм (polymorphism) - последний из трех "китов", на которых держится объектно-ориентированное программирование Слово это можно перевести.
Учебный курс Объектно-ориентированный анализ и программирование Лекция 7 Методы как средство реализации операций Лекции читает кандидат технических наук.
Множественное наследование class A {... }; class B {... }; class C : public A, protected B {... }; !!! Спецификатор доступа распространяется только на.
Наследование time time_with_sec В чем преимущества наследования? Наследование кода – поля, метод inc Появилось два класса с которыми точно можно обращаться.
1 ©Павловская Т.А. (СПбГУ ИТМО) Курс «С#. Программирование на языке высокого уровня» Павловская Т.А.
С# и ООП Формальное определение класса с C# Класс в C# - это пользовательский тип данных (user defined type), который состоит из данных (часто называемых.
С++, начала ООП Семинар 3 Рябова Анна Сергеевна
Объектно-ориентированное программирование С++. Лекция 6 Карпов В.Э.
НаследованиеНаследование2 class Point { double x; double y; Color color; }; class Radius { Point center; double radius; };
Высокоуровневые методы информатики и программирования Лекция 14 Интерфейсы.
НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.НГТУ, каф. ВТ Наследование в С++ Макаревич Л. Г.
Наследование. Наследование – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся.
Основы информатики Классы Заикин Олег Сергеевич zaikin.all24.org
1 Java 6. ИНТЕРФЕЙСЫ И ВНУТРЕННИЕ КЛАССЫ. 2 Интерфейсы Не являются классами Ни один из объявленных методов не может быть реализован внутри интерфейса.
Лекция 10 ОбъектыЛекция 10 ОбъектыООП Инкапсуляция Возможность совместного хранения данных и кода для их обработки Наследование Возможность расширять существующие.
Лекция 4. Введение в С++ Наследование, множественное наследование. Конструкторы, деструкторы. Виртуальные функции.
Транксрипт:

Наследование и полиморфизм. «Быть» или «Иметь» а так же «Точно» или «Как получится»

Наследование = расширение возможностей.

В чём разница? «Быть - классическое наследование, is a» Каждый производный класс расширяет возможности базового. «Иметь – включение- делегирование, has a» Класс объявляется внутри другого, который разрешает с помощью своих методов использовать возможности вложенного

Полиморфизм. Одинаковый интерфейс – разные действия. Классический. public class Target : Object { public virtual void SelfDestruction() {…} } public class AirTarget : Target { public override void SelfDestruction() {…} } Target t = new Target(); AirTarget at = new AirTarget(); t.SelfDestruction(); at.SelfDestruction(); Полиморфизм для конкретного случая («ad-hoc», «позднее связывание – определение вызываемого метода в ходе выполнения»). Target a1 = new AirTarget(), a2 = new Airship(); a1.SelfDestruction(); a2.SelfDestruction(); Тип объекта может определяться динамически, соответственно «на ходу» определяется вызываемый метод.

А теперь подробнее…

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

public class A { public A(A_Params) {…} } public class B : A { public B(B_params) : base (A_Params) {…} } public Manager(string Name,int ID,int Section ) : base (Name, ID) { … }

Семейные тайны и запреты. Можно запретить внешний вызов метода, объявив его как protected. При этом он будет считаться видимым для всех наследуемых, но недоступным извне. Можно вообще запретить наследование, объявив класс как sealed. Например, для запрета наследования за пределами сборки. public sealed class LostClass : SomeClass { … }

Модель включения- делегирования. Класс-контейнер – родительский. Внутренний класс – дочерний. Ответственность за жизнеспособность внутреннего класса несёт внешний. Делегирование «полномочий». Пользователь может и не подозревать о существовании внутреннего класса, вызывая методы «опекуна».

Как это происходит… Само наследование: public class Car { … private Radio musicBox; public Car () { musicBox = new Radio(); } Или public class Car { … private Radio = new musicBox(); }; Делегирование public class Car { … public void TurnOnRadio() { … musicBox.TurnOn(); }

И ещё – вложенные (nested) классы. Исключительно вспомогательные функции. Невозможно обращение извне. Строгий контроль области видимости. Почти то же самое, что модель включения-делегирования. Можно вкладывать классы, интерфейсы и структуры.

public class Car { … private class Radio { public Radio() { … } public void TurnOn() { … } private Radio musicBox; public void TurnOnRadio() { musicBox.TurnOn(); }

Полиморфизм («не совсем» перегрузка!). Задача – заставить один и тот же метод (метод с одинаковым прототипом) по- разному реагировать на объекты разных классов. В замещённых версиях методов, как правило, расширяется функциональность метода базового класса. Метод базового класса, который должен быть замещён в производном, объявляется как virtual. Метод производного класса, который должен замещать виртуальный метод базового класса, должен быть объявлен как override.

public class Target {... public virtual void Selfdestruction() {... } public class AirTarger : Target {... public override void SelfDestruction() { base.SelfDestruction();... }

Это далеко не всё! Абстрактные классы – запрет на создание объектов «самого базового» класса. Принудительный полиморфизм – абстрактные методы. Контроль версий членов класса (versioning). Приведение типов.

Абстрактные классы. Абстрактные классы позволяют запретить создание объектов некоторого класса. abstract public class MainBaseClass { … } Не обязательно наличие чисто виртуальных методов.

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

Вся мощь полиморфизма public abstract class Target {… public virtual void SelfDestruction(); } public class AirTarget : Target {… public override void SelfDestruction() {…} } public class LandTarget : Target {--} public class SeaTarget : Target {--} public class MainClass {… public static int Main (string[] args) {… Target[] targets = {new AirTarget(), new Landtarget(), new SeaTarget()}; for (int i=0;i

Контроль версий членов классов. Разрыв отношений на уровне одного метода – достаточно объявить метод как new. Сокрытие методов. Запрет наследования логики базовых версий. Вызов варианта базового класса с помощью явного приведения типа. Используется при межъязыковом наследовании, например.

Приведение типов. Если один класс является производным от другого, то всегда безопасно ссылаться на объект производного класса через объект базового класса. …