Отправляет email-рассылки с помощью сервиса Sendsay

Программируем на C#

  Все выпуски  

Программируем на C# 0x0002 Struct


Информационный Канал Subscribe.Ru


Struct

# 0x00002

Первые исходные коды программ (ПО) для первых компьютеров помещались на одном тетрадном листе. В дальнейшем, по мере возрастания требований к ПО, рос и размер исходного кода, для распечатки которого уже требовался рулон бумаги длинной в десятки метров. Чтобы как-то упорядочить исходный код, было изобретено процедурное программирование - когда часто повторяющиеся участки кода оформлялись в виде процедуры (подпрограммы, функции), которая затем вызывалась из нужного места программы. Это позволило не только уменьшить объем текста, но и улучшить его читаемость. Теперь программисту, вместо того чтобы писать десятки строк кода, достаточно было вызвать процедуру, например SaveToFile из названия которой уже понятно, что она делает.

Но в дальнейшем, процедурное программирование исчерпало себя, теперь уже текст программы состоял из многочисленных вызовов процедур, кроме того часто встречались процедуры выполняющие одни и те же действия но над разными данными - AddString, AddInteger, AddFloat...

Стало очевидным, что большая часть процедур предназначена для той или иной манипуляции над данными. И тогда было предложено объединить данные, и процедуры для работы с ними, в одну сущность - так появилось Объектно-Ориентированное Программирование (ООП)

Класс - так называется сущность объединяющая процедуры и данные.

В классе производится описание всей внутренней логики для работы этого класса, чтобы использовать класс в программе, на его основе создается объект.

string S;

Объект S созданный на основе класса string.

В C# в отличие от других ООП языков стирается грань между объектом и переменной, так как все типы данных в C# это классы, в отличие от других языков, где они представлены просто как свободные участки памяти, в которые можно записывать/считывать данные.

Существует "облегчённый" вариант класса - структура. Возможности структуры несколько ограничены, но принцип работы тот же.

Предположим, что мы хотим создать игру. Как и в любой игре в ней будут игровые объекты, одни будут управляться игроком, другие - компьютером. Для того чтобы отобразить наш объект на экране, потребуется знать координаты этого объекта в пространстве. Кроме того должна быть возможность движения этого объекта, то есть изменения его координат.

public struct GameObject

{

private int x,y,z;

}

эта структура (struct) GameObject, содержит три целочисленных поля - x,y,z определяющих координаты в пространстве.

Обратим внимание на ключевые слова public private. Они обозначают доступ к полям структуры (или класса), publicљ - доступ открыт для всех - и для разработчиков структуры и для её пользователей, private - доступ открыт только для разработчиков структуры. Почему public стоит и перед структурой? Потому что сама структура является полем класса (см. код ниже) .

Чуть позже я объясню, что я имел в виду под словами разработчик и пользователь.

Добавим несколько процедур (методов в терминологии ООП) к нашей структуре.

public struct GameObject

{

private int x,y,z;

public void Accelerator(int x, int y, int z)

{

this.x+=x;

this.y+=y;

this.z+=z;

}

}

Метод Accelerator позволяет изменить координаты нашего объекта, изменяя значения координат на соответствующие значения смещения объекта переданные в параметрах метода.

Что такое this?

this обозначает объект, в котором был вызван метод, в данном случае Accelerator. К примеру - создан объект Tank, затем вызван метод Accelerator - Tank.Accelerator(1,2,3); Таким образом this определяет, что менять нужно поля объекта Tank, а не скажем объекта Plane.

Вообще использовать this было не обязательно, просто я, таким образом, использовал одни и те же имена переменных и для полей структуры и для параметров метода, а this позволило избежать конфликта имён.

public struct GameObject

{

private int x,y,z;

public GameObject(int x,int y, int z)

{

this.x=x;

this.y=y;

this.z=z;љљљљљљљљљљ

}

}

Специальный метод, называемый конструктором, позволяющий инициализировать поля структуры. GameObject Tank = new GameObject(2,3,4);

public struct GameObject

{

private int x,y,z;

public static GameObject operator ++ (GameObject g)

{

g.x++; g.y++; g.z++;

return g;

}

}

позволяет определить оператор ++ для нашего объекта. Я решил, что ++ увеличивает все координаты на 1. А можно было увеличить только одну координату на 10, или вообще выполнить какое либо другое действие.љ Tank++ выполнит увеличение x,y,z объекта Tank на единицу.

Предлагаю самостоятельно изучить приведенный ниже код:

namespace StructTutorial

{

using System;љљ

/// <summary>

/// add your summary

/// </summary>

public class OurStruct

{љљљ

#region OurStruct

/// <summary>

/// Our struct

/// </summary>

public struct GameObject

{

private int x,y,z;

public int r;

/// <summary>

/// Constructor

/// </summary>

/// <param name="x">initial x position</param>

/// <param name="y">initial x position</param>

/// <param name="z">initial x position</param>

public GameObject(int x,int y, int z)

{

this.x=x;

this.y=y;

this.z=z;

}љљљ

/// <summary>

/// Show position

/// </summary>

/// <returns>GameObject current coordinates</returns>

public override string ToString()

{

return "GameObject x= "+x+" y= "+y+" z= "+z;

}љљљљљљљ

/// <summary>

/// Game object speed surplus

/// </summary>

/// <param name="g"></param>

/// <returns></returns>

public static GameObject operator ++ (GameObject g)

{

g.x++; g.y++; g.z++;

return g;

}

/// <summary>

/// Game object Brake

/// </summary>

/// <param name="g"></param>

/// <returns></returns>

public static GameObject operator -- (GameObject g)

{

g.x--; g.y--; g.z--;

return g;

}

/// <summary>

/// Game object accelerator

/// </summary>

/// <param name="x">x - coordinate acceleration</param>

/// <param name="y">y - coordinate acceleration</param>

/// <param name="z">z - coordinate acceleration</param>

public void Accelerator(int x, int y, int z)

{

this.x+=x;

this.y+=y;

this.z+=z;

}

}

#endregion

/// <summary>

/// Entry point 4 our app

/// </summary>љљ

static void Main()

{

GameObject Tank = new GameObject(2,3,4);

Console.WriteLine("Original " + Tank.ToString());љљ

Tank ++;

Console.WriteLine("after ++ " + Tank.ToString());љљљљљљљ

Tank --;

Console.WriteLine("after -- " + Tank.ToString());љљ

Tank.Accelerator(2,3,4);

Console.WriteLine("after Acceleration " + Tank.ToString()); 

Console.ReadLine();

}

}

}

 

 

Теперь самое интересное:

Если в свойствах проекта сменить Common Properties|General|Output Typeљ с Console Application на Class Library. Мы, при компиляции, получим dll которую можно будет распространять другим программистам - пользователям этой библиотеки (это о чём я говорил выше). Подключив эту библиотеку в пункт References они смогут использовать все public классы, методы, и т.д.

class test

{

static void Main()

{

StructTutorial.OurStruct.GameObject Plane = new StructTutorial.OurStruct.GameObject();

Plane.Accelerator(1,2,3);

Console.WriteLine(Plane.ToString());

Console.ReadLine();

}

}

 

 

Это лишь малая часть возможностей ООП, полную мощь можно получить используя классы. О них мы и поговорим в следующий раз.

љљљљљљљљ


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное