000135. ООП в c# Часть 2 - Полиморфизм
Last updated
Last updated
ООП в 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"; |
То MyCar будет игнорировать их и выведет только эти: Однако что будет, если воспользоваться таким конструктором:
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|49802526png
217`157||oop_v_c_chast_2_polimorfizm|1392798665