000135. ООП в c# Часть 2 - Полиморфизм

ООП в c# Часть 2 - Полиморфизм||wmysterio|wmysterio|wmysterio@yandex.ru|||Это вторая часть по ООП в c#. Что же ещё спрятано под этим интересным словом? Очень многое! Сегодня я хотел-бы поговорить о таком интересном явлении, как "Полиморфизм". В переводе это слово означает "Изменять форму". В программировании это значит, что объекту одного класса можно присвоить значения другого объекта класса, оба из которых находятся в одной иерархии. Возьмём иерархию из предыдущего урока:

public class Car { public int Speed = 0; public Car() { } private void SetSpeed(int NewSpeed) { Speed = NewSpeed; } } public class Lanborghini : Car{ public int DoorCount = 4; public string EngineType = "Automatic"; public Lanborghini() { } } public class Gallardo : Lanborghini { public int EnginePower = 1500; public int TireSize = 4; public Gallardo() { } }

Теперь мы можем пользоваться следующими конструкторами:

Car MyCar0 = new Car(); Car MyCar1 = new Lanborghini(); Car MyCar2 = new Gallardo(); Lanborghini MyLambo = new Gallardo(); Gallardo MyGallardo = new Gallardo();

А так же присваивать объектам одного класса значения объектов других:

MyCar0 = MyCar1; MyCar0 = MyCar2; MyCar0 = MyLambo; MyCar0 = MyGallardo; MyCar1 = MyCar0; MyCar1 = MyCar2; MyCar1 = MyLambo; MyCar1 = MyGallardo; MyCar2 = MyCar0; MyCar2 = MyCar1; MyCar2 = MyLambo; MyCar2 = MyGallardo; MyLambo = MyGallardo;

Зелёным цветом я выделил процесс полиморфизма. При этом объект будет иметь только те команды, которые свойственны данному классу. То есть если в нас есть такой конструктор:

Car MyCar = new Lanborghini();

То MyCar будет иметь только те команды, которые есть в классе Car. Если в Lanborghini имелись такие поля:

public int DoorCount = 4; public string EngineType = "Automatic";

Gallardo MyGallardo = new Car();

? Нам выведет ошибку: "Ошибка 1 Не удается неявно преобразовать тип "Car" в "Gallardo". Существует явное преобразование". Давайте тогда преобразуем явно. Делается это, как уже звучало в ранних уроках, спомощью скобок перед выражением:

Gallardo MyGallardo = (Gallardo) new Car(); или так: Gallardo MyGallardo = new Gallardo(); MyGallardo = (Gallardo)MyCar;

Отлично! Никаких ошибок в компиляторе в нас уже не возникает. Давайте запустим консольное приложение из этого кода

static void Main() { Car MyCar = new Lanborghini(); Gallardo MyGallardo = (Gallardo)MyCar ; Console.ReadKey(); }

что бы проверить на работоспособность программу и процесс преобразования. И опять у нас появилось исключение в таком страшном окне с сообщением: "Не удалось привести тип объекта "Consol.Lanborghini" к типу "Consol.Gallardo".". Напрашивается один вывод: "Нельзя преобразовать объекты в другие, если они являются выше по иерархии, то есть нельзя преобразовать Потомка в Родителя или старше". Также нельзя преобразовать объекты, которые наследуются от одного родителя. Например, если добавить новый класс Porche:

public class Porshe : Car { public int DoorCount = 2; public string EngineType = "Automatic"; public int WheelsSize = 5; public Porshe() { } }

То преобразовать его в Lanborghini также не получится:

myLambo = (Lanborghini)myPorshe; myPorshe = (Porshe)myLambo;

Сообщение компилятора: "Преобразование НЕВОЗМОЖНО", он даже не пытается преобразовать.

Вот такая небольшая порция информации о полиморфизме. Я не стал особо углубляться, для скриптинга GTA 4 этого вполне достаточно.|804|1|0|49802526png217`157||oop_v_c_chast_2_polimorfizm|1392798665

Last updated