Рейтинг - 5.0 (1)

Всем хай! Четвёртая часть по функциям я хотел-бы посвятить такому интересному явлению, как свойства. Собственно свойства это не совсем функции, так как играют другую роль, но всё-же они чем-то напоминают функции и решил добавить этот урок к этому блоку.

Для того, что-бы написать свойство класса, достаточно написать следующий код:
СПЕЦИФИКАТОР_ДОСТУПА ТИП_СВОЙСТВА НАЗВАНИЕ_СВОЙСТВА {
    get {
        return ВОЗВРАЩАЕМЫЙ_ПАРАМЕТР;
    }

    set {
        ПРИНИМАЕМЫЙ_ПАРАМЕТР = value;
    }
}
Со спецификатором  доступа думаю всё понятно. Если не понятно, то читайте уроки блока по ООП.
ТИП_СВОЙСТВА - тип значения, которое принимает или возвращает свойство.
НАЗВАНИЕ_СВОЙСТВА - имя свойства(как и имя функции) но так как это, не функция, то скобок ставить не нужно.
ВОЗВРАЩАЕМЫЙ_ПАРАМЕТР - параметр, который возвращает ту сущность, которая есть в классе.
ПРИНИМАЕМЫЙ_ПАРАМЕТР - задаёт полю класса "некоторое значение". Это "некоторое значение" является оператор value.

Что касается get и set, этих братьев-акробатов. get - значит получить значение поля класса, set - наоборот, задаёт значение полю. Эти операторы являются блочными конструкциями и наличие фигурных скобок обязательное. Также в блоке get обязательно должен быть return а в set - value.

Давайте возьмём класс Car из предыдущего урока, и добавим ему свойство:
    public class Car {
        private string _auto = "Автомобиль";
        public int Speed = 200;

        public Car() { }

        public int CurrentSpeed {
            get {
                return Speed;
            }

            set {
                Speed = value;
            }
        }

    }
Я убрал процедуру SetSpeed, теперь скорость в нас будет свойством. Давайте проверим в нашей программе работоспособность свойств:
    class Program {
        static void Main() {
            Car MyCar = new Car();
            Console.WriteLine( "Изначальная скорость: {0}", MyCar.CurrentSpeed );
            MyCar.CurrentSpeed = 150;
            Console.WriteLine( "Новая скорость: {0}", MyCar.CurrentSpeed );
            Console.ReadKey();
        }
    }
Результат:

Как видим, свойство отработало у нас, как нужно.

Если не нужно выполнять каких-то действий при получении значения или чтобы задать его, то принято писать следующую конструкцию:
public int CurrentSpeed { get; set; }
Компилятор поймёт это как абсолютно новое свойство, по этому поле Speed нам не нужно, а наш класс будет иметь следующий вид:
    public class Car {
        private string _auto = "Автомобиль";

        public Car() { }

        public int CurrentSpeed { get; set; }
    }
Проверим программу:

Как видим, изначальное значение по-умолчанию присвоило 0. С этого можно сделать вывод, что по-умолчанию компилятор подставляет пустые значения для свойства с get. Для чисел пустым считается число 0, для строк - "" и.т.п.

Каким-же образом задавать изначальные значения? Это делается в конструкторе класса. В нашем случаи это такой код:
    public class Car {
        private string _auto = "Автомобиль";

        public Car() {
            CurrentSpeed = 200;
        }

        public int CurrentSpeed { get; set; }
    }
Результат:

Давайте переделаем поле _auto под свойство Name для всех классов, которые были в предыдущем уроке. Мы получим:
    public class Car {
        public Car() {
            Name = "Автомобиль";
        }
        public string Name { get; set; }
        public int CurrentSpeed { get; set; }
    }

    public class Lanborghini : Car {
        public int DoorCount = 4;
        public string EngineType = "Automatic";
        public Lanborghini() {
            Name = "Ламборгини";
        }
    }

    public class Porshe : Car {
        public int DoorCount = 2;
        public string EngineType = "Automatic";
        public int WheelsSize = 5;
        public Porshe() {
            Name = "Порше";
        }
    }
    public class Gallardo : Lanborghini {
        public int EnginePower = 1500;
        public int TireSize = 4;
        public Gallardo() {
            Name = "Галлардо";
        }
    }
Проверим работоспособность следующим кодом:
    class Program {
        static void Main() {
            Car MyCar = new Car();
            Lanborghini MyLambo = new Lanborghini();
            Porshe MyPorshe = new Porshe();
            Gallardo MyGallardo = new Gallardo();

            Console.WriteLine( "{0}", MyCar.Name );
            Console.WriteLine( "{0}", MyLambo.Name );
            Console.WriteLine( "{0}", MyPorshe.Name );
            Console.WriteLine( "{0}", MyGallardo.Name );

            Console.ReadKey();
        }
    }
По-идеи в нас должно вывести имя транспорта каждого класса. Результат:

Так как свойство NAME объявлено в "главном классе", то его взяли и производные. В этом нам помогло наследование :)

Вот код всей программы:
Код
using System;

namespace Consol {
    class Program {
        static void Main() {
            Car MyCar = new Car();
            Lanborghini MyLambo = new Lanborghini();
            Porshe MyPorshe = new Porshe();
            Gallardo MyGallardo = new Gallardo();

            Console.WriteLine( "{0}", MyCar.Name );
            Console.WriteLine( "{0}", MyLambo.Name );
            Console.WriteLine( "{0}", MyPorshe.Name );
            Console.WriteLine( "{0}", MyGallardo.Name );

            Console.ReadKey();
        }
    }

    public class Car {
        public Car() {
            Name = "Автомобиль";
        }

        public string Name { get; set; }

        public int CurrentSpeed { get; set; }
    }

    public class Lanborghini : Car {
        public int DoorCount = 4;
        public string EngineType = "Automatic";

        public Lanborghini() {
            Name = "Ламборгини";
        }
    }

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

        public Porshe() {
            Name = "Порше";
        }
    }

    public class Gallardo : Lanborghini {
        public int EnginePower = 1500;
        public int TireSize = 4;

        public Gallardo() {
            Name = "Галлардо";
        }
    }
}
Это всё равно не вся информация о свойствах, но её достаточно, что понять главный принцип. На этом всё, ждите новых уроков smile
Вход на сайт

Поиск
Категории раздела
Мини-чат
Пожалуйста, все вопросы по скриптингу задавать на форуме!
Наш опрос
А вы проходили GTA San Andreas на 100% без читов и скриптов?
Всего ответов: 3
Активность на сайте
Пожертвования
Кошельки WebMoney:
U859420971000
R407741810602
Z331072372430
E314272616890
Друзья сайта
Полезные ресурсы
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сегодня нас посетили:
wmysterio
Реклама