Это вторая часть по ООП в 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 этого вполне достаточно.
Вход на сайт

Поиск
Категории раздела
Мини-чат
Наш опрос
Что скажете о новом дизайне?
Всего ответов: 0
Активность на сайте
Друзья сайта
Статистика

Онлайн всего: 2
Гостей: 1
Пользователей: 1
wmysterio
Сегодня нас посетили:
wmysterio