Уроки моддинга
GTA Script GeneratorЗадать вопрос
  • О сайте
    • Проекту помогали
  • GTA SA, VC, III (PC, Classic)
    • Раздел 01. Основы
      • Общие сведения об уроках и минимальный набор программ
      • Установка Sanny Builder. Базовые настройки
      • Синтаксис, комментарии, опкоды, команды. Ключевые слова
      • Типы данных. Литералы. Константы
      • Типы проектов
      • Переменные. Операторы
      • 00012. Редактирование main.scm. Переменные (Часть 3)
      • 000175. Трюк с локальными массивами
      • 00073. Переменные, как члены класса. Коментарии в поиске опкодов. Макросы
      • 00017. Условия в Sanny Builder (Часть 1)
      • 00018. Условия в Sanny Builder (Часть 2)
      • 00019. Условия в Sanny Builder (Часть 3)
      • 000181. Условия в Sanny Builder (Часть 4)
      • 00045. Циклы (Часть 1 - while)
      • 00047. Циклы ( Часть 2 - for )
      • 00049. Циклы ( Часть 3 - repeat ). Вложенные циклы
      • 00087. Таблицы переходов
      • 00059. Подключение текстовых файлов, scm-функции
      • 000155. Использование SCM-функций (опкод 0AB1)
      • 000162. Используем scm-функции в качестве проверок
      • Координаты. Угол. Получение координат и угла Z
      • 000154. Вся правда о wait 0
    • Раздел 02. CLEO
      • Текст
        • 000158. Динамическая GXT-таблица или виртуальные GXT-записи
        • 00033. Работа с текстом
      • Игрок
        • 00021. Одежда СЖ
      • Транспорт
        • 00026. Создание транспорта
        • 000115. Работа с грузовиками и прицепами
        • 000172. Эктра-части автомобилей
        • 00042. Всё о поездах
        • 00080. Тюнинг транспорта, работа с компонентами тюнинга
        • 00029. Транспорт и команды, свойственны ему
        • 00046. Плавающие и лётные средства передвижения
        • 00082. Работа с частями автомобиля
      • Актёры
        • 000152. Заставляем актёра говорить. Аудио-таблицы
        • 000177. Трюк со специальными актёрами
        • 00020. Типы пешеходов, номера банд и отношение между ними
        • 00024. Модель. Создание актёра
        • 00028. Актёры и команды, свойственны им. Команды для игрока
        • 00056. Специальные актёры
        • 00060. События актёров
        • 00084. Модели поведения актёров
      • Объекты
        • 00030. Объекты и команды, свойственны им
        • 00025. Создание объекта
        • 000142. Метание объектов
      • 00027. Пикапы
      • 00031. Маркеры и сферы
      • 000122. Типы чекпоинтов, маркеров. Детальный обзор
      • 00055. Cleo. Основные понятия, отличия от main'а, простые примеры
      • 00061. Cleo-миссии
      • 00064. Работа со стартерами ( Cleo - Часть 1 )
      • 00065. Работа со стартерами ( Cleo - Часть 2 )
      • 00083. Запуск другого потока с Cleo-скрипта
      • 00079. Немного о глобальных CLEO-переменных
      • 00066. Работа со стартерами ( Дополнительные условия )
      • 000137. Группы в GTA San Andreas
      • 00098. Последовательность в анимации
      • 000120. Пути пешеходов и анимационные пути
      • 000178. RRR-файлы в GTA SA. Как их делать и использовать-
      • 000180. Длинные последовательности в анимации
      • 00022. Типы зон. Аудио-зоны
      • 00023. Работа с клавишами. Делаем сохранение
      • 00037. Анимация. Основные команды и примеры их использования
      • 00041. Работа с интерьерами
      • 00036. Катсцены и всё, что необходимо для примитивного видеоролика
      • 000174. Снова статистика игрока
      • 00040. Как создать свой чит-
      • 00090. Работа с гаражами
      • 000176. Выделение памяти
      • 00076. Статистика игрока
      • 00094. Пропуск видеороликов
      • 00072. Работа со светом. Прожектор
      • 00092. Работа с файлами ( форматированное чтение )
      • 00093. Работа с файлами ( Дозапись )
      • 00071. Визуальные эффекты в GTA San Andreas
      • 00069. Взрывы и всё, что связано с огнём.
      • 00086. Движения объектов и эффектов
      • 00068. Использование RC
      • 00067. Использование турелей
      • 00057. Работа с INI-файлами ( запись и считывание )
      • 00044. Работа с панелями ( таблицами )
      • 00043. Работа с аудио
      • 00038. Рисование на экране (Часть 1 - Текст)
      • 00039. Рисование на экране (Часть 2 - Текстуры)
    • Раздел 03. MAIN.SCM
      • 0009. Редактирование main.scm. Потоки и опкоды (Часть 1)
      • 00014. Редактирование main.scm. Потоки и опкоды (Часть 2)
      • 00013. Редактирование main.scm. Потоки и опкоды (Часть 3)
      • 00062. Работа со стартерами ( MAIN.SCM - Часть 1 )
      • 00063. Работа со стартерами ( MAIN.SCM - Часть 2 )
      • 00054. Внешние скрипты в main.scm
      • 00050. Статус-тексты
      • 00053. Таймеры
      • 00035. Делаем простую миссию
    • Раздел 04. Разное
      • 00088. Интересные опкоды (Часть 1)
      • 00089. Интересные опкоды (Часть 2)
      • Интересное в скриптинге
      • 000167. Интересное в скриптинге. Часть 2
      • 00081. Защита скриптов, снятие слабой защиты
      • 000157. Защита скриптов,снятие её + Подробнее об $NOSOURCE
      • 000121. Варианты использования main.scm
      • 000179. Избавляемся от "ёлочек"
      • 000171. Контроль за перемещениями мыши
      • 000182. Колода карт в GTA San Andreas
      • Работа с магазинами
      • 00091. Создания собственных классов и кейвордов
      • 00085. Работа с битами переменных
      • 00051. Работа с HEX. HEX-буфер
      • 00097. Написания DLL библиотек и использование их с скриптах
    • Раздел 05. Игровая память
      • 00058. Работа с игровой памятью (Часть 1- статические адреса)
      • 00074. Динамические адреса памяти. ( Часть 1 - структура актёра )
      • 00075. Динамические адреса памяти. ( Часть 2 - структура автомобиля )
      • 00077. Динамические адреса памяти. ( Часть 3 - структура объекта )
      • 00096. Игровая память. Динамические адреса (структура weapon.dat)
    • Раздел 06. Алгоритмы и примеры
      • 000153. Пример полноценной миссии "Ограбление"
      • 00095. Как сделать нервометр-
      • 00052. Пример полноценной миссии "Взрывчатка"
      • 000114. Делаем спидометр!
      • 000161. Очень длинные миссии в main.scm
      • 000112. Делаем графическое меню
      • 000113. Делаем гоночную миссию ( SARMC v0.9 )
      • 000133. Делаем диалоги в миссиях
      • 00032. Делаем простой скрипт (приходим к точке и убиваем нужную цель)
    • Раздел 07. Plugin SDK (SA)
      • Простейший плагин
      • Работа с массивами объектов
      • Рисуем
      • Короны
      • Класс шрифта (CFont)
    • Раздел 08. Руководство по программам
      • Руководство по использованию программы GTA-SA Crazy IMG Editor
      • Руководство по использованию программы Ped Editor
      • Руководство по использованию программы Rus2gxtCoder
      • Руководство по использованию программы FXT Editor
      • Руководство по использованию программы GTA Animation Manager
      • Руководство по использованию программы TXD Workshop
      • Руководство по использованию программы GTA GXT Editor
      • Руководство по использованию Map Editor
      • Руководство по использованию программы MapCleaner
  • GTA 4 (PC)
    • Раздел 01. ScriptHookDotNet
      • Всё, что необходимо перед началом скриптинга GTA 4
      • Создание проекта и его открытие
      • Наш первый скрипт. Необходимые условия его написания
      • 000102. Метки и прыжки
      • 00034. Что такое Blip- Основные комадны
      • 000107. Обзор класса GAME
      • 000108. Обзор класса PLAYER(Часть 1)
      • 000109. Обзор класса PLAYER(Часть 2)
      • 000110. Обзор класса PLAYER(Часть 3)
      • 000111. Vector - Что это такое и с чем его едят
      • 000116. Обзор класса World
      • 000117. Обзор класса Model
      • 000118. Обзор класса Vehicles
      • 000119. Обзор класса Ped
      • 000126. Pickup в GTA 4
      • 000127. Обзор класса Group
      • 000141. Списки в c#. Запуск нескольких скритов в GTA 4
  • Программирование
    • C#
      • 000103. Типы данных в C#. Базовые операции над ними.
      • 000104. Блочные конструкции. Условия
      • 000105. Блочные конструкции. Циклы
      • 000106. Массивы и структуры
      • 000123. Блочные конструкции. Перечисления
      • 000124. Блочные конструкции. Оператор управдения swith
      • 000125. Блочные конструкции. Цикл foreach
      • 000128. Как делать функции c#- Часть 1
      • 000129. Как делать функции c#- Часть 2
      • 000130. Альтернативные условия
      • 000131. Как делать функции c#- Часть 3
      • 000132. ООП в c# Часть 1
      • 000135. ООП в c# Часть 2 - Полиморфизм
      • 000136. Как делать функции c#- Часть 4
      • 000138. Детальнее о static
      • 000139. Блочные конструкции. Исключения
      • 000140. Делегаты и события в c#
      • 000143. Знакомство с формами
      • 000144. Панель элементов
      • 000149. Кнопки, Текст-боксы и метки
      • 000151. Запуск другой формы из основной, ListBox, MenuStrip
      • 000160. Сериализация и десериализация XML в c#
      • 000163. Консоль. Основные команды
      • 000165. Цикл foreach для своих классов
      • 000168. Перегрузка операторов в c#
      • 000169. Анонимные и динамические типы в c#
      • 000170. Анонимные функции и лямбда-выражения в c#
      • 000173. C# введение в Linq
      • 00048. Детальнее о ref, out и checked
      • 000150. Подключаем dll-библиотеку, работа с файлами
    • C++
      • Выбор среды компилирования, типы данных, первая программа
      • Математика, адреса данных
  • Полезные ссылки
    • Уроки от Vital (видео)
    • База опкодов (SBL)
    • Сайт Sanny Builder
    • Сайт CLEO
  • На удаление
    • Раздел 99. Старые уроки
      • 00010. Управление Sanny Builder и её особенности
      • 0000. Всё, что необходимо перед началом скриптинга
      • 000156. Вступление в скриптинг GTA 3
Powered by GitBook
On this page

Was this helpful?

  1. Программирование
  2. C#

000132. ООП в c# Часть 1

Previous000131. Как делать функции c#- Часть 3Next000135. ООП в c# Часть 2 - Полиморфизм

Last updated 3 years ago

Was this helpful?

ООП в c# Часть 1||wmysterio|wmysterio|wmysterio@yandex.ru|||Всем привет! В очередной раз мы рассмотрим возможности ЯП (языка программирования, для тех, кто не знал это сокращение ) C#, и сегодня речь пойдёт о классах. Мы научимся создавать классы и изучим базовые понятия с объектно-ориентированного программирования(ООП). Давайте начнём с понятия "Класс". Класс - это пользовательский тип данных, который содержит в себе некий набор данных, функций. Конструкцию класса вы уже видели много раз из уроков по скриптхук'у:

СПЕЦИФИКАТОР ДОСТУПА ИМЯ КЛАССА { СПЕЦИФИКАТОР ДОСТУПА КОНСТРУКТОР() { } ПОЛЯ, МЕТОДЫ, СВОЙСТВА, ПРОЦЕДУРЫ. }

Как уже звучало в предыдущих уроках, есть 4 спецификатора доступа public, protected, private и internal. Этот спецификатор указывает видимость содержимого класса из вне(то есть за пределами класса). Я составил таблицу, и перечислил разницу между этими спецификаторами:

Спецификатор

Описание

public

Публичный, поле доступно всем желающим объектам, которые работают с этим классом

protected

Защищённый, поле доступно только классу и его потомку

private

Приватное, поле или метод доступно только самому классу

internal

Внутренний, поле доступно только в одной области пространства имён. Не будет виден для другого namespace.

Пример класса вы видели из предыдущих уроков по c#. По-этому для вас объявить класс не составит проблем. Вот у меня получился примерно такой:

public class Car { public int Speed = 0; public int Accelerate = 0; public int Handling = 0; public Car() { // Пустой конструктор } public void SetSpeed(int NewSpeed) { Speed = NewSpeed; } }

Зелёным цветом обозначены изначальные данные, которые свойственны этому классу. Их называют полями класса. Синим цветом обозначен конструктор класса. Фиолетовым цветом обозначены функции, которые может выполнять объект класса. В C# такие функции принято называть методами, так что метод - это та же функция. Количество полей, методов и конструкторов в классе может быть сколько угодно. Так же само и классов в пространстве имён может быть сколько влезет. Давайте создадим ещё один класс:

public class Lanborghini { public int DoorCount = 4; public string EngineType = "Automatic"; public Lanborghini() { // Пустой конструктор } }

Существует такое понятие, как наследование классов. В народе это известно как понятия "Предок-Потомок", "Отец-Сын", "Иерархия классов". Это понятия говорит о том, что класс-наследник(Сын, Потомок) может наследовать свойства, процедуры класса "Предка"("Отца"). Если навести пример из жизни, то Сын Иван может наследовать некие особые приметы Отца Дмитрия, например, цвет глаз, манеру походки и тому подобное. Давайте сделаем тоже самое в программировании. Для этого нужно объявить класса-наследника. Пусть это будет Ламборгини, который наследует класс Машина. Наш код теперь будет иметь следующий вид:

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

Распознать класс-наследника можно по этой записи:

Это значит, что класс Lanborghini наследует некие методы и свойства класса Car и при этом имеет свои же методы. Давайте напишем код программы, где мы создадим объект класса Lanborghini:

using System; namespace Consol { class Program { static void Main() { Lanborghini Lambo = new Lanborghini(); // Здесь будут другие команды Console.ReadKey(); } } public class Car { public int Speed = 0; public Car() { } public void SetSpeed(int NewSpeed) { Speed = NewSpeed; } } public class Lanborghini : Car{ public int DoorCount = 4; public string EngineType = "Automatic"; public Lanborghini() { } } }

Давайте посмотрим какие же свойства и команды имеет объект, что мы создали: Оранжевым стрелками обозначены поля, которые имеет сам класс Lanborghini. Но откуда взялись поля, обозначены зелёными стрелками??? Здесь и проявилось наследование! Класс заимствовал эти поля из класса Car и теперь мы можем применять их к нашей Ламбо Теперь важную роль играет спецификаторы доступа. Давайте в классе Car мы напишем private возле процедуры SetSpeed:

И теперь посмотрим, что нам скажет объект Lambo: Процедура пропала! Таким образом класс Lanborghini не смог наследовать её из класса Car. Теперь, я думаю, вы поняли для чего нужны эти спецификаторы вообще :) Давайте сделаем эксперимент: создадим класс Gallardo, который будет потомком класса Lamborghini, и посмотрим, что унаследует он от Предка:

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

Gallardo MyCar = new Gallardo();

protected int Speed = 0;

public int GSpeed;

А в конструкторе заполним его:

public Gallardo() { GSpeed = Speed; }

public class Lanborghini : Car{ public int DoorCount = 4; public string EngineType = "Automatic"; public int GSpeed; public Lanborghini() { GSpeed = Speed; } } public class Gallardo : Lanborghini { public int EnginePower = 1500; public int TireSize = 4; public Gallardo() { } }


С этого урока вы уже понимаете, для чего нужен символ ":" в следующее выражение из уроков о ScriptHoockDotNet:

public class Thread : Script { // ... }

Класс Thread (наш аналог потока из Sanny Builder) наследует поля, свойства, методы, процедуры, классы и тому подобное из "главного" класса Script, который находится в библиотеке ScriptHookDotNet.dll. Это как минимум основы ООП, и у ваш арсенал сриптинга должны входить эти возможности и умение ими воспользоваться. :) Важно! В отличии от некоторых языков программирования, класс-Потомок может наследовать поля только одного класса-Родителя.


P.S Возможно, некоторые вещи я неправильно назвал или описал. Напишите в комментах, что не так, я исправлю.|964|1|0|80243543png425504400474\|49862482png174173|26345781png174156\|42299098png169195|37370351png169173\|46562547png187148|07018888png167195\|90920270png167195||oop_v_c|1392798677

Создадим в теле программы объект класса Gallardo и посмотрим его наследство (если вы понимаете о чём я )

Унаследовал вот что: Оранжевыми стрелками показаны поля, которые имеет класс Gallardo, зелёными стрелками указаны поля, которые унаследовал класс от Lanborghini. Что же значит синяя стрелка? Он её унаследовал от класса Car. Как такое возможно, ведь мы указали, что наследовать нужно из класса Lanborghini? Здесь можно сделать вывод: "Всё, что наследует класс-Отец от своего класса-Отца наследуется и для потомка". Если взять выражение из жизни, то можно выразится так: "Всё что наследует Отец от своего Дедушки, наследуется и для Сына". В этом и суть иерархии классов. Можно сделать такую картинку, что бы легче понять: Оранжевыми стрелками указаны поля классов, которые задаются изначально в классе. Зелёными стрелками показано какие поля унаследует класс от своего отца. Синими стрелками показано какие поля унаследуются классом от более "старших" классов Несколько слов скажу о спецификаторе protected. Если в классе Car сделать переменную Speed с этим спецификатором

то класс-потом его унаследует, но вызвать его из вне не получится Но получать доступ к этому полю мы можем внутри. Если в конструкторе мы нажмём CTRL+ПРОБЕЛ, то мы сможем увидеть наследованное поле: Ключик возле поля указывает, что параметр унаследовался со спецификатором protected. Мы можем создать поле в классе Gallardo, которое будет принимать унаследованное значение

И теперь мы сможем увидеть поле GSpeed в теле основной программы, как поле, унаследованное от Car, которое переданное в поле класса Gallardo (как видите пошла тафтология и повторение терминов, так как я не могу подобрать нужных синонимов к этим словам ): Если подобное сделать для класса Lanborghini:

то его потомок унаследует это значение: И при этом внутри себя может получать доступ к полю своего Дедушки. В следующий части мы поговорим о понятии "Полиморфизма" и.т.п.

smile
tongue
smile
smile