ExpC_Module 7ru_1.ppt
- Количество слайдов: 23
Модуль 7 Наследование и полиморфизм
Обзор модуля В этом модуле вы изучите n Реализацию наследования n Замещение методов n Закрытые классы n Полиморфизм Изучение C#/ Модуль 7/ 2 из 23
Занятие 1 - Реализация наследования На первом занятии, Реализация наследования, вы изучите: n Понятие наследования. n Описание реализации наследования в C#. n Использование модификатора доступа protected. n Использование ключевого слова base. n Использование ключевого слова new. n Наследование конструкторов. Изучение C#/ Модуль 7/ 3 из 23
Определение n n n Подобие физических свойств ребенка таковым у родителей происходит потому, что ребенок наследует эти характеристики от своих родителей. Наследование позволяет создавать класс путем извлечения общих атрибутов и методов существующего класса. Класс, от которого происходит создание нового, называется базовым, а создаваемый класс называется производным. Изучение C#/ Модуль 7/ 4 из 23
Назначение n n n Назначение наследования состоит в повторном Обобщение - Наследование позволяет использовании общих методов и атрибутов реализовывать обобщение путем создания классов без их повторного создания. базовых классов. Повторное использование кода позволяет Специализация же код в разных позволяет использовать тот - Наследование приложениях с реализовывать специализацию без них. небольшими изменениями или путем создания производных классов. Кроме повторного использования, наследование широко используется для: Расширение - Наследование позволяет n Обобщения (генерализации) расширять функциональность производного класса путем создания дополнительных методов и n Специализации атрибутов, отсутствующих в базовом классе. n Расширения Изучение C#/ Модуль 7/ 5 из 23
Реализация наследования n Синтаксис Пример Синтаксис получения класса, производного от § другого, синтаксис используется для наследования класса в C#. Следующий в C# достаточно простой. class Animal { public void Eat() <Derived. Class. Name> : <Base. Class. Name> { Console. Write. Line("Every animal eats something. "); Производный класс теперь может наследовать Derived. Class. Name: Имя созданного дочернего класса. public void Do. Something() { методы и атрибуты базового класса, от которого Base. Class. Name: Имя родительского класса, не Console. Write. Line("Every animal does something. "); унаследован дочерний класс. } объявленные как private. } n где, } class Cat : Animal { § Следующий Main(String[] args) static void синтаксис используется { класса. Cat obj. Cat = new Cat(); obj. Cat. Eat(); <object. Name>. <Method. Name>; obj. Cat. Do. Something(); } где, } для вызова метода базового object. Name: Объект базового класса. Method. Name: Имя метода базового класса. Изучение C#/ Модуль 7/ 6 из 23
Модификатор доступа “protected” Вывод Пример Синтаксис n Защищает элементы данных, объявленные с class. Cat loves to eat Mouse. переменную с модификатором § Следующий The Animal синтаксис объявляет { protected. помощью Laze модификатора. The Cat loves toэтого around. protected string Food; protectedstring Activity; <Variable. Name>; protected <data_type> } class Cat: Animal n где, { data_type: Тип элемента данных. static void Main(String[] Имя переменной Variable. Name: args) { Cat obj. Cat = new Cat(); n § Следующий синтаксис объявляет метод с модификатором protected. obj. Cat. Food = "Mouse"; obj. Cat. Activity = "Laze around"; Console. Write. Line("The Cat loves to eat " + bj. Cat. Food + ". "); Console. Write. Line("The Cat loves to " + obj. Cat. Activity + ". "); protected <return_type> <Method. Name>(argument_list); } } Задается ключевым словом protected. Переменные или методы, объявленные как protected, доступны только в своем классе или в производном классе. где, return_type: Тип возвращаемого методом значения. Method. Name: Имя метода. argument_list: Список параметров. Изучение C#/ Модуль 7/ 7 из 23
Ключевое слово “base” n Ключевое Синтаксис слово base позволяет иметь доступ к переменным и методам базового класса из class <Class. Name> { производного класса. <access modifier> <returntype> <Base. Method> {} {} } n class <Class. Name 1> : <Class. Name> { base. <Base. Method>; } При наследовании класса, методы и переменные, определенные в базовом классе, могут быть повторно объявлены в производном классе. где, n <Class. Name>: Имя базового класса. <access modifier>: Определяет область видимости класса или метода. <returntype>: Тип возвращаемого методом значения. <Base. Method>: Метод базового класса. <Class. Name 1>: Имя производного класса. base: Ключевое слово для доступа к элементам базового класса. Нельзя использовать ключевое слово base для вызова статичных методов базового класса. Изучение C#/ Модуль 7/ 8 из 23
Ключевое слово “new” n Может использоваться или как оператор, или как Синтаксис Пример модификатор в C#. class <Class. Name> <access modifier> class Employees { int _emp. Id = 1; string _emp. Name = "James Anderson"; int _age = 25; public void Display() { Console. Write. Line("Employee ID: " + _emp. Id); Console. Write. Line("Employee Name: " + _emp. Name); } } class Department : Employees { int _dept. Id = 501; string _dept. Name = "Sales"; new void Display() { base. Display(); Console. Write. Line("Department ID: " + _dept. Id); Console. Write. Line("Department Name: " + _dept. Name); } static void Main (string [] args) { Department obj. Department = new Department(); obj. Department. Display(); } } Employees obj. Emp = new Employees(); { <access modifier> <returntype> <Base. Method> {} n } Используется для создания экземпляров класса путем <access modifier> class <Class. Name 1> : <Class. Name> { создания его объектов. new <access modifier> void <Base. Method> {} } n где, Как модификатор, оно используется для скрывания <access modifier>: Определяет область видимости класса или методов или переменных базового класса, которые метода. <return type>: Тип возвращаемого наследуются в производном классе. методом значения. <Class. Name>: Имя базового класса. <Class. Name 1>: Имя производного класса. new: Ключевое слово для сокрытия метода базового класса. n Это позволяет переопределять наследованные методы или переменные в производном классе. Изучение C#/ Модуль 7/ 9 из 23
Наследование конструктора n n Конструкторы - методы, автоматически вызываемые Пример при создании экземпляра класса. class Animal { public Animal() { Console. Write. Line("Animal constructor without parameters"); } public Animal(String name) { Console. Write. Line("Animal constructor with a string parameter"); } } class Canine : Animal { //base() takes a string value called “Lion” public Canine() : base("Lion") { Console. Write. Line("Derived Canine"); } } class Details { static void Main(String[] args) { Canine obj. Canine = new Canine(); } } В C# нельзя наследовать конструкторы так, как наследуются методы. Экземпляр производного класса всегда сначала вызывает конструктор базового класса, за которым следует конструктор производного класса. Ключевое слово base позволяет передавать параметры конструктору. Изучение C#/ Модуль 7/ 10 из 23
Занятие 2 - Замещение метода На втором занятии, Замещение метода, вы изучите: n Определение замещения метода. n Объяснение ключевых слов virtual и override. Изучение C#/ Модуль 7/ 11 из 23
Замещение метода n n n Это особенность, позволяющая производному классу замещать или переопределять методы базового класса. Замещение метода в производном классе может изменить тело метода, объявленного в базовом классе. Метод, реализованный в производном классе, называется замещенным или переопределенным базовым методом. Изучение C#/ Модуль 7/ 12 из 23
Ключевые слова “virtual” и “override” n Можно Вывод заместить метод базового класса в Синтаксис Пример производном классе с помощью соответствующих class Animal Cat loves to eat override <return type> <access_modifier> virtual <access modifier>the mouse<return_type> {ключевых слов virtual и override. public virtual void Eat() <Method. Name>(<parameter-list>); <Method. Name>(<parameters-list>) { где, } n Console. Write. Line("Every animal eats something"); protected void Do. Something() override: Ключевое слово для замещения базового При необходимости замещения метода в { где, Console. Write. Line("Every animal does something"); производном классе. класса, нужно объявить метод в доступа метода, который } access_modifier: Модификатор базовом классе с } может быть private, public, protected или internal. ключевым словом virtual. class Cat: Animal virtual: Ключевое слово, используемое для объявления метода в базовом классе, который может быть переопределен n производным классом. Метод, объявленный с ключевым словом virtual, return_type: Тип возвращаемого методом значения. называется виртуальным методом. Method. Name: Имя виртуального метода. parameter-list: Список параметров метода; является опициональным. { //Класс Cat переопределяет метод Eat() класса Animal public override void Eat() { Console. Write. Line("Cat loves to eat the mouse"); } static void Main(String[] args) { Cat obj. Cat = new Cat(); obj. Cat. Eat(); } n В производном классе необходимо объявить наследуемый виртуальный метод с помощью Изучение C#/ Модуль 7/ 13 из 23 ключевого слова override. }
Вызов метода базового класса n n Замещение Пример метода позволяет производному классу переопределять методы базового класса. class Student { string _student. Name = "James"; string _address = "California"; public virtual void Print. Details() { Console. Write. Line("Student Name: " + _student. Name); Console. Write. Line("Address: " + _address); } } class Grade : Student { string _class = "Four"; float _percent = 71. 25 F; public override void Print. Details() { Console. Write. Line("Class: " + _class); Console. Write. Line("Percentage: " + _percent); } static void Main(string[] args) { Student obj. Student = new Student(); Grade obj. Grade = new Grade(); obj. Student. Print. Details(); obj. Grade. Print. Details(); } } Переопределение методов базового класса разрешает доступ к новому методу, но не к оригинальному методу базового класса. Изучение C#/ Модуль 7/ 14 из 23
Занятие 3 - Закрытые классы На третьем занятии, Закрытые классы, вы изучите: n Определение закрытых классов в C#. n Описание назначения закрытых классов. Изучение C#/ Модуль 7/ 15 из 23
Закрытые классы n Закрытый Синтаксис Пример (sealed) класс не позволяет наследование. sealed class Product sealed class <Class. Name> { { public int Quantity; // тело класса public int Cost; Ключевое слово sealed защищает класс от наследования другим классом. } n n class Goods { где, static void Main(string [] args) { sealed: Ключевое слово, используемое для защиты класса от Product obj. Product = new Product(); наследования. obj. Product. Quantity = 50; Class. Name: Имя закрываемого класса. obj. Product. Cost = 75; Console. Write. Line("Quantity of the Product: " + obj. Product. Quantity); Console. Write. Line("Cost of the Product: " + obj. Product. Cost); } } class Pen : Product { } Закрытый класс не может быть базовым классом, так как не позволяет наследования. Если произойдет попытка наследования закрытого класса, компилятор C# сгенерирует ошибку. Изучение C#/ Модуль 7/ 16 из 23
Назначение закрытых классов n n n Рассмотрим класс с именем System. Information, состоящий из критических методов, влияющих на работу операционной системы. Вы можете запретить третьей стороне наследовать класс System. Information и замещать его методы, соответственно вызывая проблемы безопасности. Можно объявить класс System. Information закрытым для защиты его переменных и методов от изменений. Изучение C#/ Модуль 7/ 17 из 23
Рекомендации n n Закрытые классы нельзя наследовать. Класс отмечается закрытым при следующих условиях: n Если замещение методов класса может отразиться в непредвиденном функционионале класса. n Для защиты класса от модификации третьей стороной. Изучение C#/ Модуль 7/ 18 из 23
Занятие 4 - Полиморфизм На последнем занятии, Полиморфизм, вы изучите: n Описание полиморфизма в C#. n Реализацию полиморфизма. n Описание полиморфизма при компиляции и во время выполнения. Изучение C#/ Модуль 7/ 19 из 23
Полиморфизм n n n Полиморфизм происходит от двух греческих слов - Poly и Morphos. Полиморфизм - способность сущности вести себя различным образом в различных ситуациях. Следующие два метода класса имеют одинаковое имя, но разные сигнатуры, осуществляя ту же базовую операцию, но разными путями: Area(float radius) Area(float base, float height) Изучение C#/ Модуль 7/ 20 из 23
Реализация n Можно Вывод Пример реализовать полиморфизм в C# с помощью перегрузки и замещения методов. class Area of Rectangle: 220 { Area of int Calculate. Area(int len, static triangle: 1. 875 int wide) { return len * wide; } Методы с Calculate. Area(double val. One, double val. Two) разными одинаковыми именами, но static double { сигнатурами, называются перегружаемыми. return 0. 5 * val. One * val. Two; n } static void Main(string[] args) { int length = 10; int breadth = 22; double tbase = 2. 5; double theight = 1. 5; Console. Write. Line("Area of Rectangle: " + Calculate. Area(length, breadth)); Console. Write. Line("Area of triangle: " + Calculate. Area(tbase, theight)); } Методы, наследуемые от базового класса в производном классе и модифицируемые в нем, назыаются замещаемыми методами. n } Изучение C#/ Модуль 7/ 21 из 23
Полиморфизм при компиляции и во время выполнения Полиморфизм при Пример компиляции Полиморфизм во время выполнения using System; class Circle { protected const double PI = 3. 14; protected double Radius = 14. 9; public virtual double Area() { return PI * Radius; } } class Cone : Circle { protected double Side = 10. 2; public override double Area() { return PI * Radius * Side; } static void Main(string[] args) { Circle obj. Run. One = new Circle(); Console. Write. Line("Area is: " + obj. Run. One. Area()); Circle obj. Run. Two = new Cone(); Console. Write. Line("Area is: " + obj. Run. Two. Area()); } } Реализуется через перегрузку. Реализуется через переопределение. Выполняется во время компилирования, так компилятор знает, какой метод выполнить в зависимости от числа их параметров и типов данных. Выполняется во время выполнения, так компилятор не знает, какой метод выполнить базовго класса или производного класса. Называется статичным полиморфизмом. Называется динамическим полиморфизмом. Изучение C#/ Модуль 7/ 22 из 23
Резюме n Реализация наследования n n Замещение метода n n Процесс переопределения методов базового класса в производном классе. Закрытые классы n n Наследование может быть реализовано написанием имени производного класса, затем двоеточия, а затем имени базового класса. Классы, от которых запрещено наследование. Полиморфизм n Способность сущности иметь разное поведение в различных ситуациях. Изучение C#/ Модуль 7/ 23 из 23
ExpC_Module 7ru_1.ppt