000135. ООП в c# Часть 2 - Полиморфизм
ООП в c# Часть 2 - Полиморфизм||wmysterio|wmysterio|[email protected]|||Это вторая часть по ООП в 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|49802526
png
217`157||oop_v_c_chast_2_polimorfizm|1392798665Last modified 1yr ago