SlideShare uma empresa Scribd logo
1 de 24
2013
Курс по програмиране на C#
Занятие №11
Полиморфизъм (част 1): Презаписване на членове.
Презаписване на оператори. Предефиниране на членове
Съдържание
• Полиморфизъм. Видове полиморфизъм
• Презаписване на членове
• Презаписване на оператори
• Предефиниране на членове
Полиморфизъм
• Какво е „полиморфизъм“?
– Третият основен принцип на ООП
• Кои са първите два?
– Многообразие („πολύς“ и „μορφή“)
– Еднотипна работа с разнотипни данни
– Обобщаване на възможности, но с различна реализация
– Обединяване на сходни функционалности в нещо общо
– Гъвкав и лесен начин за поддръжка на кода
Полиморфизъм
• Полиморфизъм в C#
– Презаписване на членове
– Презаписване на оператори
– Предефиниране на членове
– Абстрактни класове и членове
– Интерфейси
– Шаблони
Видове полиморфизъм
• Статичен полиморфизъм (compile time)
– Ad hoc polymorphism:
• Презаписване (overload) на членове
• Презаписване (overload) на оператори
• Преобразуване на типове (coercion)
– Parametric polymorphism
• Шаблони
• Динамичен полиморфизъм (run time)
– Subtype polymorphism
• Предефиниране (override) на членове
• Абстракция
Презаписване на членове
• Какво е „презаписване на членове“ (member overloading)?
– Повече от един член с едно и също наименование, но различна
сигнатура (Познато?)
– Членове, които могат да се презаписват:
• Методи
• Конструктори
• Индексатори
• Оператори
– Компилаторът открива най-подходящият член, който да се използва,
в зависимост от подаваните аргументи и съответните параметри
– Неявно превръщане на типовете на аргументите
– Ако изборът на подходящ член е нееднозначен, компилаторът дава
грешка
Презаписване на методи и конструктори
// ДЕМО
Презаписване на индексатори
// ДЕМО
Презаписване на членове
• Приложение на презаписвнето на членове
– Прилагане на сходна функционалност върху различни типове
данни
– Прави кода по-четим, тъй като сходните операции имат еднакви
наименования
– Да не се злоупотребява: прилага се, когато поведението е сходно,
а типът на резултата – един и същи
Презаписване на оператори
• Какво е „презаписване на оператори“?
– Операторите в C# са дефинирани за повечето вградени типове
– Повечето оператори обаче не са дефинирани за собствените ни
класове и структури
– Дава възможност в дефиницията на клас да включим оператори за
по-естествено взаимодействие с обекти от дефиниращия и/или
други класове
– Да не се злоупотребява: По-естествено не означава по-лесно!
• Видове презаписваеми оператори
– Унарни
– Бинарни
– Превръщане на данни
Презаписване на оператори
public struct Color
{
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
// презаписваме проверката дали е true
public static bool operator true(Color c)
{
return c.R != 0 || c.G != 0 || c.B != 0;
}
// презаписваме проверката дали е false
// забележка: винаги се презаписват в заедно
public static bool operator false(Color c)
{
return c.R == 0 && c.G == 0 && c.B == 0;
}
}
• Унарни оператори
– “+”, “-”, “~”, “!”, “++” и “--”
• Правила
– „+“, „-“ и “~” – приемат като
параметър дефиниращия тип и
връщат резултат от произволен
тип
– „++“ и “--” – приемат като
параметър и връщат
дефиниращия тип
– “true” и “false” – приемат като
параметър дефиниращия тип и
връщат bool
Презаписване на оператори
public struct Color
{
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
// презаписваме смесването на ДВА цвята
public static Color operator +(
Color l, Color r)
{
return new Color
{
R = l.R + r.R,
G = l.G + r.G,
B = l.B + r.B,
};
}
}
• Бинарни оператори
– „+“, „-“, „*“, „/“ и „%“
– „&“, “|”, “^”, “<<“ и “>>”
– “==“, “!=“, “<“, “>”, “<=“ и “>=“
• Правила
– Операторите за сравнение
могат да се презаписват само
по двойки
– Трябва да се има предвид
сравнението на стойности и
референции
Презаписване на оператори
public struct Color
{
public int R { get; set; }
public int G { get; set; }
public int B { get; set; }
// неявно превръщане от Color към число
public static implicit operator long(Color c)
{
return
((256 * c.R + c.G) * 256 + c.B);
}
// явно превръщане от Color към низ
public static explicit operator string(
Color c)
{
return string.Format("#{0:x}{1:x}{2:x}",
c.R, c.G, c.B);
}
}
• Преобразуване на данни
– неявно (implicit)
– явно (explicit)
Предефиниране на членове
• Какво е „предефиниране на членове“ (member overriding)?
– Възможност на клас-наследник да предостави различна
имплементация на член дефиниран в родителски клас
– Позволява промяна на поведението на член в клас-наследник
– Описване на член със същото наименования (и параметри)
– Членът на кой точно клас ще бъде използван, зависи от типа на
обекта, а не от типа на референцията
– Само виртуални членове могат да бъдат предефинирани
• Какво е „виртуален член“?
– Член, който може да бъде предефиниран в клас-наследник
– Нестатични методи, свойства и индексатори
– Виртуалността в C# се указва изрично
Предефиниране на членове
class Animal
{
public virtual void MakeSound()
{
// не правим нищо, защото животните
// не издават звук в общия случай
}
}
• Разлика между виртуални и
невиртуални членове
– При невиртуалните членове,
използваният член се определя
от типа на референцията
– При виртуалните членове,
използваният член се определя
от типа на обекта
• Декларирането на виртуален
член
– Използва се ключовата дума
virtual след модификатора за
достъп
Предефиниране на членове
class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Woof woof!");
}
}
class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Meow!");
}
}
class Fish : Animal
{
}
• Деклариране на
предефиниран член
– Използва се ключовата дума
override след модификатора за
достъп
– В родителски клас трябва да е
деклариран виртуален член със
същата сигнатура и видимост
– Не е задължително всички
виртуални членове да бъдат
предефинирани в класовете-
наследници
Предефиниране на членове
// взимаме _някакво_ животно от зоопарка
Animal animal = zoo.GetAnimal();
// караме животното да издаде звук
animal.MakeSound();
// какъв звук ще издаде, зависи от вида
// животно
• Използване на виртуални
членове
– Синтактично не се различава от
използването на невиртуални
членове
– Поведението може да се
различава
• Извикваният метод от
йерархията се определя от
истинския тип на обекта
Предефиниране на членове
class Book
{
public string Name { get; set; }
public virtual void ReadFromConsole()
{
Console.Write("Enter name: ");
Name = Console.ReadLine();
}
}
class ScientificBook : Book
{
public string ScientificField { get; set; }
public override void ReadFromConsole()
{
base.ReadFromConsole();
Console.Write("Enter scientific field: ");
ScientificField = Console.ReadLine();
}
}
• Преизползване на
родителския член
– Понякога се налага
имплементацията на
родителския член да бъде
разширена, а не подменена
– Използва се ключовата дума
base, следвана от оператора “.”
и наименованието на члена
(заедно с аргументите му)
– По същия начин могат да се
извикват и други членове на
родителския клас
Предефиниране на членове
// ДЕМО
Предефиниране на членове
• Приложение на предефинирането на членове
– Често се налага една и съща „формална“ операция да се
реализира по различен начин вътрешно в различни класове
– Осигурява гъвкавост на вътрешната реализация
– Позволява разширяемост на членовете на родителските класове
– Избягване на превръщания надолу по йерархията (downcasting)
Задачи за упражнение
• Преработете програмата „Геометрични фигури“ от
предишните упражнения, така че да се възползвате от
новите възможности на езика, за които научихте:
– Добавете презаписани конструктори за базовите класове Object2D
и Object3D
– Добавете нов базов клас GeometryObject съдържащ конструктор с
параметър „наименование“ и виртуален метод за генериране на
произволни параметри на обекта
– Изведете общите за различните видове обекти виртуални методи в
съответните базови класове
– Създайте нов клас GeometryStore, в който да съхранявате
геометрични обекти, индексатори за тях по номер и наименование,
както и метод за добавяне на създаден вече обект
Задачи за упражнение
• Преработете програмата „Библиотека“ от предишните
упражнения, така че да се възползвате от новите
възможности на езика, за които научихте:
– Създайте нов конструктор на базовия клас на всички произведения,
който да приема като параметър низ – ISBN. Добавете свойство за
това колко бройки от произведението са налични за ползване
– Изведете общите за различните видове произведения виртуални
методи в съответните базови класове
– Създайте клас Library, в който се съхраняват произведения,
индексатори за тях по номер и ISBN, както и метод за добавяне
– Добавете метод в класа Library за търсене на произведения
– Добавете метод в класа Library за показване на информацията за
подадено издание
Въпроси?
Благодаря!
• Валери Дачев
– valery@david.bg
– @vdachev
– https://facebook.com/vdachev
• ДАВИД академия
– acad@david.bg
– http://acad.david.bg/
– @david_academy
– https://facebook.com/DavidAcademy

Mais conteúdo relacionado

Mais procurados

Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#DAVID Academy
 
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4DAVID Academy
 
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...DAVID Academy
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSDAVID Academy
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2DAVID Academy
 
Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSDAVID Academy
 
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLDAVID Academy
 
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...DAVID Academy
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3DAVID Academy
 
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...DAVID Academy
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)DAVID Academy
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLDAVID Academy
 
JDK 1.5 New Features
JDK 1.5 New FeaturesJDK 1.5 New Features
JDK 1.5 New FeaturesSvetlin Nakov
 

Mais procurados (20)

Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2015), занятие №4 - JavaScript (част 2/2)
 
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
Курс по програмиране на C# 2013 - 1. Въведение в компютърното програмиране и C#
 
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2015), занятие №3 - JavaScript (част 1/2)
 
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
Курс по програмиране на C# 2013 - 8. Полиморфизъм. Абстракция. Шаблони. Вград...
 
Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4Училищен курс по програмиране на C# (2013/2014), занятие №4
Училищен курс по програмиране на C# (2013/2014), занятие №4
 
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
Курс по програмиране на C# 2013 - 7. Свойства. Индексатори. Наследяване. Изкл...
 
Курс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSSКурс по уеб програмиране (2014), занятие №2 - CSS
Курс по уеб програмиране (2014), занятие №2 - CSS
 
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
Курс по уеб програмиране (2014), занятие №4 - JavaScript (част 2/2)
 
Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2Училищен курс по програмиране на C# (2013/2014), занятие №2
Училищен курс по програмиране на C# (2013/2014), занятие №2
 
Курс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSSКурс по уеб програмиране (2015), занятие №2 - CSS
Курс по уеб програмиране (2015), занятие №2 - CSS
 
Курс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTMLКурс по уеб програмиране (2015), занятие №1 - HTML
Курс по уеб програмиране (2015), занятие №1 - HTML
 
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
Курс по информационни технологии (2013) - 1. Desktop приложения. Windows Form...
 
Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3Училищен курс по програмиране на C# (2013/2014), занятие №3
Училищен курс по програмиране на C# (2013/2014), занятие №3
 
Въведение в Perl
Въведение в PerlВъведение в Perl
Въведение в Perl
 
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
Курс по програмиране на C# 2013 - 6. Обектно-ориентирано програмиране. Класов...
 
Скаларни типове данни
Скаларни типове данниСкаларни типове данни
Скаларни типове данни
 
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
Курс по уеб програмиране (2014), занятие №3 - JavaScript (част 1/2)
 
Курс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTMLКурс по уеб програмиране (2014), занятие №1 - HTML
Курс по уеб програмиране (2014), занятие №1 - HTML
 
JDK 1.5 New Features
JDK 1.5 New FeaturesJDK 1.5 New Features
JDK 1.5 New Features
 
Хешове
ХешовеХешове
Хешове
 

Destaque

Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияDAVID Academy
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоDAVID Academy
 
Курс по програмиране на C# (2013) - Помагало
Курс по програмиране на C# (2013) - ПомагалоКурс по програмиране на C# (2013) - Помагало
Курс по програмиране на C# (2013) - ПомагалоDAVID Academy
 
Информационни технологи за V клас, изд. Булвест 2000
Информационни технологи за V клас, изд. Булвест 2000Информационни технологи за V клас, изд. Булвест 2000
Информационни технологи за V клас, изд. Булвест 2000Ангел Ангелов
 
Помагало по география за 6 клас
Помагало по география за 6 класПомагало по география за 6 клас
Помагало по география за 6 класDani Hranov
 
Годишно обобщение по география и икономика - 5 клас
Годишно обобщение по география и икономика - 5 класГодишно обобщение по география и икономика - 5 клас
Годишно обобщение по география и икономика - 5 класMilena Petkova
 
събиране на десетични дроби. свойства
събиране на десетични дроби. свойствасъбиране на десетични дроби. свойства
събиране на десетични дроби. свойстваliageorg
 
деление на дд задачи
деление на дд задачиделение на дд задачи
деление на дд задачиliageorg
 
събиране и изваждане на дд
събиране и изваждане на ддсъбиране и изваждане на дд
събиране и изваждане на ддliageorg
 
четене и сравняване на десетични дроби
четене и сравняване на десетични дробичетене и сравняване на десетични дроби
четене и сравняване на десетични дробиliageorg
 
всички действия с дд
всички действия с ддвсички действия с дд
всички действия с ддliageorg
 
умножение на десетични дроби
умножение на десетични дробиумножение на десетични дроби
умножение на десетични дробиliageorg
 
фигури
фигурифигури
фигуриliageorg
 
5 клас урок 19 НОВА ПРОГРАМА
5 клас урок 19 НОВА ПРОГРАМА5 клас урок 19 НОВА ПРОГРАМА
5 клас урок 19 НОВА ПРОГРАМАЮлія Артюх
 
Програмирането със C sharp
Програмирането със C sharpПрограмирането със C sharp
Програмирането със C sharpJulian Sapoundjiev
 

Destaque (18)

Училищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - УпражненияУчилищен курс по програмиране на C# (2013/2014) - Упражнения
Училищен курс по програмиране на C# (2013/2014) - Упражнения
 
Училищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - ПомагалоУчилищен курс по програмиране на C# (2013/2014) - Помагало
Училищен курс по програмиране на C# (2013/2014) - Помагало
 
Курс по програмиране на C# (2013) - Помагало
Курс по програмиране на C# (2013) - ПомагалоКурс по програмиране на C# (2013) - Помагало
Курс по програмиране на C# (2013) - Помагало
 
Информационни технологи за V клас, изд. Булвест 2000
Информационни технологи за V клас, изд. Булвест 2000Информационни технологи за V клас, изд. Булвест 2000
Информационни технологи за V клас, изд. Булвест 2000
 
OOP 1 - 5
OOP 1 - 5OOP 1 - 5
OOP 1 - 5
 
Лице
ЛицеЛице
Лице
 
История на лакомствата1
История на лакомствата1История на лакомствата1
История на лакомствата1
 
Помагало по география за 6 клас
Помагало по география за 6 класПомагало по география за 6 клас
Помагало по география за 6 клас
 
Годишно обобщение по география и икономика - 5 клас
Годишно обобщение по география и икономика - 5 класГодишно обобщение по география и икономика - 5 клас
Годишно обобщение по география и икономика - 5 клас
 
събиране на десетични дроби. свойства
събиране на десетични дроби. свойствасъбиране на десетични дроби. свойства
събиране на десетични дроби. свойства
 
деление на дд задачи
деление на дд задачиделение на дд задачи
деление на дд задачи
 
събиране и изваждане на дд
събиране и изваждане на ддсъбиране и изваждане на дд
събиране и изваждане на дд
 
четене и сравняване на десетични дроби
четене и сравняване на десетични дробичетене и сравняване на десетични дроби
четене и сравняване на десетични дроби
 
всички действия с дд
всички действия с ддвсички действия с дд
всички действия с дд
 
умножение на десетични дроби
умножение на десетични дробиумножение на десетични дроби
умножение на десетични дроби
 
фигури
фигурифигури
фигури
 
5 клас урок 19 НОВА ПРОГРАМА
5 клас урок 19 НОВА ПРОГРАМА5 клас урок 19 НОВА ПРОГРАМА
5 клас урок 19 НОВА ПРОГРАМА
 
Програмирането със C sharp
Програмирането със C sharpПрограмирането със C sharp
Програмирането със C sharp
 

Semelhante a Училищен курс по програмиране на C# (2013/2014), занятие №11

Курс по програмиране на C# 2013 - 3. Функции и методи. Рекурсия
Курс по програмиране на C# 2013 - 3. Функции и методи. РекурсияКурс по програмиране на C# 2013 - 3. Функции и методи. Рекурсия
Курс по програмиране на C# 2013 - 3. Функции и методи. РекурсияDAVID Academy
 
High Quality Code Introduction
High Quality Code IntroductionHigh Quality Code Introduction
High Quality Code IntroductionSvetlin Nakov
 
Nakov High Quality Code
Nakov High Quality CodeNakov High Quality Code
Nakov High Quality CodeSvetlin Nakov
 
Acceptance testing with Selenium 2 and PHPUnit
Acceptance testing with Selenium 2 and PHPUnitAcceptance testing with Selenium 2 and PHPUnit
Acceptance testing with Selenium 2 and PHPUnitBisser Todorov
 
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...DAVID Academy
 
Web applications with Catalyst BG
Web applications with Catalyst BGWeb applications with Catalyst BG
Web applications with Catalyst BGsvilen.ivanov
 
Word Press за маниаци
Word Press за маниациWord Press за маниаци
Word Press за маниациKaloyan Tsvetkov
 
Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1DAVID Academy
 
5. vb promenlivi
5. vb promenlivi5. vb promenlivi
5. vb promenlividnaidenowa
 
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLКурс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLDAVID Academy
 
BARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovBARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovSvetlin Nakov
 
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функцииКурс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функцииDAVID Academy
 
Python choreographe NAOqi Framework
Python choreographe NAOqi FrameworkPython choreographe NAOqi Framework
Python choreographe NAOqi FrameworkAtelier for robotics
 
18 operatori i funkcii
18 operatori i funkcii18 operatori i funkcii
18 operatori i funkciiIvan Peev
 
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...DAVID Academy
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroSvetlin Nakov
 
Web and WS based Embedded Systems
Web and WS based Embedded SystemsWeb and WS based Embedded Systems
Web and WS based Embedded SystemsNikolay Kakanakov
 

Semelhante a Училищен курс по програмиране на C# (2013/2014), занятие №11 (20)

Курс по програмиране на C# 2013 - 3. Функции и методи. Рекурсия
Курс по програмиране на C# 2013 - 3. Функции и методи. РекурсияКурс по програмиране на C# 2013 - 3. Функции и методи. Рекурсия
Курс по програмиране на C# 2013 - 3. Функции и методи. Рекурсия
 
High Quality Code Introduction
High Quality Code IntroductionHigh Quality Code Introduction
High Quality Code Introduction
 
Nakov High Quality Code
Nakov High Quality CodeNakov High Quality Code
Nakov High Quality Code
 
Acceptance testing with Selenium 2 and PHPUnit
Acceptance testing with Selenium 2 and PHPUnitAcceptance testing with Selenium 2 and PHPUnit
Acceptance testing with Selenium 2 and PHPUnit
 
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
Курс по програмиране за напреднали (2012) - 1. Обектно-ориентирано програмира...
 
Web applications with Catalyst BG
Web applications with Catalyst BGWeb applications with Catalyst BG
Web applications with Catalyst BG
 
Word Press за маниаци
Word Press за маниациWord Press за маниаци
Word Press за маниаци
 
Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1Училищен курс по програмиране на C# (2013/2014), занятие №1
Училищен курс по програмиране на C# (2013/2014), занятие №1
 
Why do we need a language like go?
Why do we need a language like go?Why do we need a language like go?
Why do we need a language like go?
 
5. vb promenlivi
5. vb promenlivi5. vb promenlivi
5. vb promenlivi
 
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQLКурс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
Курс по информационни технологии (2013) - 3. ADO.NET, LINQ to SQL
 
BARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George PenkovBARS - Regular Expressions - Svetlin Nakov, George Penkov
BARS - Regular Expressions - Svetlin Nakov, George Penkov
 
Writing tests in Go
Writing tests in GoWriting tests in Go
Writing tests in Go
 
C++ OpenFest 2015
C++ OpenFest 2015C++ OpenFest 2015
C++ OpenFest 2015
 
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функцииКурс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
Курс по програмиране на C# 2013 - 9. Делегати. Събития. Ламбда функции
 
Python choreographe NAOqi Framework
Python choreographe NAOqi FrameworkPython choreographe NAOqi Framework
Python choreographe NAOqi Framework
 
18 operatori i funkcii
18 operatori i funkcii18 operatori i funkcii
18 operatori i funkcii
 
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
Курс по програмиране за напреднали (2012) - 9. Добър и лош код. Преработка и ...
 
Nakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - IntroNakov - RDBMS Systems - Intro
Nakov - RDBMS Systems - Intro
 
Web and WS based Embedded Systems
Web and WS based Embedded SystemsWeb and WS based Embedded Systems
Web and WS based Embedded Systems
 

Mais de DAVID Academy

Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesDAVID Academy
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkDAVID Academy
 
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...DAVID Academy
 
Курс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. ПредставянеКурс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. ПредставянеDAVID Academy
 
Курс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоКурс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоDAVID Academy
 
Курс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - УпражненияКурс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - УпражненияDAVID Academy
 

Mais de DAVID Academy (6)

Курс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web ServicesКурс по информационни технологии (2013) - 5. HTTP & Web Services
Курс по информационни технологии (2013) - 5. HTTP & Web Services
 
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET FrameworkКурс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
Курс по информационни технологии (2013) - 4. XML, XSD, XML в .NET Framework
 
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
Курс по информационни технологии (2013) - 2. Бази данни. Системи за управлени...
 
Курс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. ПредставянеКурс по информационни технологии (2013) - 0. Представяне
Курс по информационни технологии (2013) - 0. Представяне
 
Курс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - ПомагалоКурс по информационни технологии (2013) - Помагало
Курс по информационни технологии (2013) - Помагало
 
Курс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - УпражненияКурс по програмиране на C# (2013) - Упражнения
Курс по програмиране на C# (2013) - Упражнения
 

Училищен курс по програмиране на C# (2013/2014), занятие №11

  • 1. 2013 Курс по програмиране на C# Занятие №11 Полиморфизъм (част 1): Презаписване на членове. Презаписване на оператори. Предефиниране на членове
  • 2. Съдържание • Полиморфизъм. Видове полиморфизъм • Презаписване на членове • Презаписване на оператори • Предефиниране на членове
  • 3. Полиморфизъм • Какво е „полиморфизъм“? – Третият основен принцип на ООП • Кои са първите два? – Многообразие („πολύς“ и „μορφή“) – Еднотипна работа с разнотипни данни – Обобщаване на възможности, но с различна реализация – Обединяване на сходни функционалности в нещо общо – Гъвкав и лесен начин за поддръжка на кода
  • 4. Полиморфизъм • Полиморфизъм в C# – Презаписване на членове – Презаписване на оператори – Предефиниране на членове – Абстрактни класове и членове – Интерфейси – Шаблони
  • 5. Видове полиморфизъм • Статичен полиморфизъм (compile time) – Ad hoc polymorphism: • Презаписване (overload) на членове • Презаписване (overload) на оператори • Преобразуване на типове (coercion) – Parametric polymorphism • Шаблони • Динамичен полиморфизъм (run time) – Subtype polymorphism • Предефиниране (override) на членове • Абстракция
  • 6. Презаписване на членове • Какво е „презаписване на членове“ (member overloading)? – Повече от един член с едно и също наименование, но различна сигнатура (Познато?) – Членове, които могат да се презаписват: • Методи • Конструктори • Индексатори • Оператори – Компилаторът открива най-подходящият член, който да се използва, в зависимост от подаваните аргументи и съответните параметри – Неявно превръщане на типовете на аргументите – Ако изборът на подходящ член е нееднозначен, компилаторът дава грешка
  • 7. Презаписване на методи и конструктори // ДЕМО
  • 9. Презаписване на членове • Приложение на презаписвнето на членове – Прилагане на сходна функционалност върху различни типове данни – Прави кода по-четим, тъй като сходните операции имат еднакви наименования – Да не се злоупотребява: прилага се, когато поведението е сходно, а типът на резултата – един и същи
  • 10. Презаписване на оператори • Какво е „презаписване на оператори“? – Операторите в C# са дефинирани за повечето вградени типове – Повечето оператори обаче не са дефинирани за собствените ни класове и структури – Дава възможност в дефиницията на клас да включим оператори за по-естествено взаимодействие с обекти от дефиниращия и/или други класове – Да не се злоупотребява: По-естествено не означава по-лесно! • Видове презаписваеми оператори – Унарни – Бинарни – Превръщане на данни
  • 11. Презаписване на оператори public struct Color { public int R { get; set; } public int G { get; set; } public int B { get; set; } // презаписваме проверката дали е true public static bool operator true(Color c) { return c.R != 0 || c.G != 0 || c.B != 0; } // презаписваме проверката дали е false // забележка: винаги се презаписват в заедно public static bool operator false(Color c) { return c.R == 0 && c.G == 0 && c.B == 0; } } • Унарни оператори – “+”, “-”, “~”, “!”, “++” и “--” • Правила – „+“, „-“ и “~” – приемат като параметър дефиниращия тип и връщат резултат от произволен тип – „++“ и “--” – приемат като параметър и връщат дефиниращия тип – “true” и “false” – приемат като параметър дефиниращия тип и връщат bool
  • 12. Презаписване на оператори public struct Color { public int R { get; set; } public int G { get; set; } public int B { get; set; } // презаписваме смесването на ДВА цвята public static Color operator +( Color l, Color r) { return new Color { R = l.R + r.R, G = l.G + r.G, B = l.B + r.B, }; } } • Бинарни оператори – „+“, „-“, „*“, „/“ и „%“ – „&“, “|”, “^”, “<<“ и “>>” – “==“, “!=“, “<“, “>”, “<=“ и “>=“ • Правила – Операторите за сравнение могат да се презаписват само по двойки – Трябва да се има предвид сравнението на стойности и референции
  • 13. Презаписване на оператори public struct Color { public int R { get; set; } public int G { get; set; } public int B { get; set; } // неявно превръщане от Color към число public static implicit operator long(Color c) { return ((256 * c.R + c.G) * 256 + c.B); } // явно превръщане от Color към низ public static explicit operator string( Color c) { return string.Format("#{0:x}{1:x}{2:x}", c.R, c.G, c.B); } } • Преобразуване на данни – неявно (implicit) – явно (explicit)
  • 14. Предефиниране на членове • Какво е „предефиниране на членове“ (member overriding)? – Възможност на клас-наследник да предостави различна имплементация на член дефиниран в родителски клас – Позволява промяна на поведението на член в клас-наследник – Описване на член със същото наименования (и параметри) – Членът на кой точно клас ще бъде използван, зависи от типа на обекта, а не от типа на референцията – Само виртуални членове могат да бъдат предефинирани • Какво е „виртуален член“? – Член, който може да бъде предефиниран в клас-наследник – Нестатични методи, свойства и индексатори – Виртуалността в C# се указва изрично
  • 15. Предефиниране на членове class Animal { public virtual void MakeSound() { // не правим нищо, защото животните // не издават звук в общия случай } } • Разлика между виртуални и невиртуални членове – При невиртуалните членове, използваният член се определя от типа на референцията – При виртуалните членове, използваният член се определя от типа на обекта • Декларирането на виртуален член – Използва се ключовата дума virtual след модификатора за достъп
  • 16. Предефиниране на членове class Dog : Animal { public override void MakeSound() { Console.WriteLine("Woof woof!"); } } class Cat : Animal { public override void MakeSound() { Console.WriteLine("Meow!"); } } class Fish : Animal { } • Деклариране на предефиниран член – Използва се ключовата дума override след модификатора за достъп – В родителски клас трябва да е деклариран виртуален член със същата сигнатура и видимост – Не е задължително всички виртуални членове да бъдат предефинирани в класовете- наследници
  • 17. Предефиниране на членове // взимаме _някакво_ животно от зоопарка Animal animal = zoo.GetAnimal(); // караме животното да издаде звук animal.MakeSound(); // какъв звук ще издаде, зависи от вида // животно • Използване на виртуални членове – Синтактично не се различава от използването на невиртуални членове – Поведението може да се различава • Извикваният метод от йерархията се определя от истинския тип на обекта
  • 18. Предефиниране на членове class Book { public string Name { get; set; } public virtual void ReadFromConsole() { Console.Write("Enter name: "); Name = Console.ReadLine(); } } class ScientificBook : Book { public string ScientificField { get; set; } public override void ReadFromConsole() { base.ReadFromConsole(); Console.Write("Enter scientific field: "); ScientificField = Console.ReadLine(); } } • Преизползване на родителския член – Понякога се налага имплементацията на родителския член да бъде разширена, а не подменена – Използва се ключовата дума base, следвана от оператора “.” и наименованието на члена (заедно с аргументите му) – По същия начин могат да се извикват и други членове на родителския клас
  • 20. Предефиниране на членове • Приложение на предефинирането на членове – Често се налага една и съща „формална“ операция да се реализира по различен начин вътрешно в различни класове – Осигурява гъвкавост на вътрешната реализация – Позволява разширяемост на членовете на родителските класове – Избягване на превръщания надолу по йерархията (downcasting)
  • 21. Задачи за упражнение • Преработете програмата „Геометрични фигури“ от предишните упражнения, така че да се възползвате от новите възможности на езика, за които научихте: – Добавете презаписани конструктори за базовите класове Object2D и Object3D – Добавете нов базов клас GeometryObject съдържащ конструктор с параметър „наименование“ и виртуален метод за генериране на произволни параметри на обекта – Изведете общите за различните видове обекти виртуални методи в съответните базови класове – Създайте нов клас GeometryStore, в който да съхранявате геометрични обекти, индексатори за тях по номер и наименование, както и метод за добавяне на създаден вече обект
  • 22. Задачи за упражнение • Преработете програмата „Библиотека“ от предишните упражнения, така че да се възползвате от новите възможности на езика, за които научихте: – Създайте нов конструктор на базовия клас на всички произведения, който да приема като параметър низ – ISBN. Добавете свойство за това колко бройки от произведението са налични за ползване – Изведете общите за различните видове произведения виртуални методи в съответните базови класове – Създайте клас Library, в който се съхраняват произведения, индексатори за тях по номер и ISBN, както и метод за добавяне – Добавете метод в класа Library за търсене на произведения – Добавете метод в класа Library за показване на информацията за подадено издание
  • 24. Благодаря! • Валери Дачев – valery@david.bg – @vdachev – https://facebook.com/vdachev • ДАВИД академия – acad@david.bg – http://acad.david.bg/ – @david_academy – https://facebook.com/DavidAcademy

Notas do Editor

  1. Демонстрация с клас Animal:- презаписване на конструктори с име и възраст;- презаписване на метод Eat() с име и с инстанция на друго животно.
  2. Демонстрация с клас Zoo и списък от животни индексирани по име и по номер.
  3. Демонстрация с предефиниране на object.ToString().