Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
MetodUkaz_VP_S.docx
Скачиваний:
16
Добавлен:
11.03.2015
Размер:
14.12 Mб
Скачать

Задания к выполнению

  1. Ознакомиться с разделами справочной службы MSDN для получения сведений об использовании интегрированной среды разработки Visual C#. Для этого необходимо перейти на сайт MSDN(http://msdn.microsoft.com/ru-RU/), а затем в поисковой строке написатьVisualC# и нажать на подходящую статью.

  2. Прочесть статьи о типах данных в C#, массивах и строках.

  3. Выполнить пример порядок выполнения которого приводится в разделе MSDN «Практическое руководство. Создание консольного приложения C#»

  4. Прочесть статью «Создание пользовательского интерфейса в VisualC#».

  5. Выполнить пример порядок выполнения которого приводится в разделе MSDN «Практическое руководство Создание приложений Windows Forms на C#», при выполнении примера поискать статьи о незнакомых элементах управления. Запустить отладку программу в пошаговом режиме и понаблюдать за ходом программы и тем как обработчики реагируют на события.

  6. Разработать алгоритм решения задачи, приведенной в варианте, написать программу на языке Visual C# и создать консольное приложение в среде разработки Visual C#.

Лабораторная работа №2

Создание консольного приложения для работы с классами

Цель работы: получить базовые знания о теме ООП и как это работает в С#. Получить практические навыки работы с классами в консольном приложенииC#.

Теоретические сведения

Объе́ктно-ориенти́рованное программи́рование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов. ООП возникло в результате развития идеологии процедурного программирования, где данные и подпрограммы (процедуры, функции) их обработки формально не связаны.

C# является объектно-ориентированным языком программирования и аналогично другим современным языкам группирует связанные поля, методы, свойства и события в структуры данных, которые называются классами.

Понятия ООП в С#:

Классы и Объекты

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

Далее представлен пример(2.1) определения класса с именем SampleClass и создание объекта с именем sampleClass1, который является экземпляром этого класса. Поскольку необходимо, чтобы функция Main была определена внутри класса, в следующем коде также определяется класс Program, однако он не используется для создания объекта.

using System;

class SampleClass

{

public void SayHello()

{

Console.WriteLine("Hello, World!");

}

}

class Program

{

//Main это входная точка программы

static void Main(string[] args)

{

SampleClass sampleClass1 = new SampleClass(); // Создание объекта

sampleClass1.SayHello(); // Вызов метода

}

}

Подобно тому, как на основе одного чертежа можно построить несколько зданий, можно создать любое количество объектов одного класса. Очень часто используются массивы или списки, содержащие множество объектов одного класса. Каждый экземпляр класса занимает отдельную область памяти; значения его полей (исключая статические поля, как описано далее) также являются независимыми. Однако для этого правила существует важное исключение, а именно статический член.

Статический член представляет собой метод или поле, доступ к которым можно получить без ссылки на определенный экземпляр класса. Самым общим статическим методом является Main, который представляет точку входа для всех программ C#; следует обратить внимание, что создавать экземпляр содержащего класса для вызова метода Main не нужно. Еще одним часто используемым статическим методом является WriteLine(вывод строки в консоль) в классе Console. При доступе к статическим методам необходимо обратить внимание на отличие в синтаксисе; с левой стороны оператора dot(точка) вместо имени экземпляра используется имя класса: Console.WriteLine.

В случае со статическим полем, оно становится независимым от экземпляра, то есть значение этого поля хранится не в экземпляре, а в типе (классе), получается даже если мы с помощью какого-либо экземпляра изменим это значение, то оно изменится и для всех остальных, так как оно одно для всех.

В статическом классе все элементы также статические. Использование статических классов, методов и полей целесообразно в ряде случаев для повышения производительности и эффективности. Однако если предполагается, что поле является полем экземпляра, хотя на самом деле оно статическое, могут возникнуть неявные ошибки.

Примечание: Каждая программа C# имеет, по крайней мере, один класс. При разработке программы рекомендуется (но не требуется) хранить отдельный класс в каждом файле исходного кода (файле CS). Если для создания классов используется интегрированная среда разработки C#, она в это же время автоматически сгенерирует файл исходного кода.

Инкапсуляция

Обычно класс представляет характеристики объекта и выполняемые им действия. Например, чтобы представить животное как класс C#, необходимо задать ему размер, скорость и силу, представленными в виде чисел, а также некоторые функции, например для движения влево MoveLeft(), вправо MoveRight(), если надо увеличить скорость SpeedUp(), остановиться Stop() и так далее, в которых можно написать код для выполнения "животным" этих действий. В C# класс животного может выглядеть следующим образом:

public class Animal

{

private int size;

private float speed;

private int strength;

public void MoveLeft() // метод

{

// код осуществляющий движение животного вправо

}

// здесь остальные методы

}

Каждый класс представляет "объект", например XmlDocument, String, Form, и для каждого такого "объекта" существуют различные действия, который он может выполнить (методы), характеристики, которые можно прочитать и изменить (свойства) и уведомления (события), отправляемые при выполнении некоторых заданных действий. Методы, свойства и события, а также все остальные внутренние переменные и константы (поля) называются членами класса. Группировка членов в классы имеет не только логический смысл, она также позволяет скрывать данные и функции, которые должны быть недоступны для другого кода. Этот принцип называют инкапсуляцией. При просмотре библиотек классов платформы .NET Framework будут видны только открытые члены этих классов. Возможно, каждый класс имеет закрытые члены, используемые внутренне этим классом или связанными классами, которые не предназначены для использования приложениями. Создавая собственные классы, нужно решить, какие члены будут открытыми, а какие — закрытыми. В С# это регулируется с помощью модификаторов доступа.

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

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

  • public : Неограниченный доступ.

  • protected : Доступ ограничен содержащим классом или типами, которые являются производными от содержащего класса. (можно использовать только внутри иерархии)

  • internal : Доступ ограничен текущей сборкой. (другой программе доступ закрыт)

  • protected internal: Доступ ограничен пределами сборки или типа, который является производным от данного класса.

  • private : Доступ ограничен содержащим типом. (можно использовать только внутри класса)

Для доступа к закрытым членами используется механизм свойств.

Свойство — это член, предоставляющий гибкий механизм для чтения, записи или вычисления значения частного (private) поля. Свойства можно использовать, как если бы они являлись открытыми членами данных, хотя в действительности они являются специальными методами, называемыми методами доступа. Это обеспечивает простой доступ к данным и позволяет повысить уровень безопасности и гибкости методов.

В данном примере, класс TimePeriod (Период времени) хранит сведения о периоде времени. Внутри класса время хранится в секундах, но свойство с именем Hours (Часы) позволяет клиенту задать время в часах. Методы доступа для свойства Hours выполняют преобразование между часами и секундами.

class TimePeriod

{

private double seconds;

public double Hours

{

get { return seconds / 3600; }

set { seconds = value * 3600; }

}

}

class Program

{

static void Main()

{

TimePeriod t = new TimePeriod();

// Вызывает метод доступа set для установки нового преобразованного значения в seconds

t.Hours = 24;

// Вызывает метод доступа get для получения преобразованного значения содержащегося в seconds

System.Console.WriteLine("Время в часах: " + t.Hours);

}

}

// Вывод: Время в часах: 24

Общие сведения о свойствах:

  • Свойства позволяют классу предоставлять общий способ получения и задания значений, скрывая при этом код реализации или проверки.

  • Метод доступа свойства getиспользуется для возврата значения свойства, а метод доступаsetиспользуется для назначения нового значения.

  • Ключевое слово valueиспользуется для определения значения, присваиваемого методом доступа set.

  • Свойства, которые не реализуют метод доступа set, доступны только для чтения.

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

Наследование

Класс может наследовать от другого класса, что означает, что он включает все члены — открытые и закрытые — исходного класса, а также дополнительные определяемые им члены. Исходный класс называется базовым классом, а новый класс — производным классом. Производный класс создается для представления особых возможностей базового класса. Например, можно определить класс Cat, который наследует от Animal. Cat может выполнять все то же, что и Animal и дополнительно одно уникальное действие. Код C# выглядит следующим образом:

public class Cat : Animal

{

public void Purr()

{

}

}

Нотация Cat:Animalозначает, чтоCatнаследует отAnimalи чтоCatтакже имеет методMoveLeftи три закрытые переменные:size,speedиstrength. Если определяется класс SiameseCat, который наследует от Cat, он будет содержать все члены Cat, а также все члены Animal.

Полиморфизм

В сфере компьютерного программирования полиморфизмом называют возможность производного класса изменять или переопределять методы, которые он наследует от базового класса. Эта функция используется, если в методе, который имеет отличия либо не определен в базовом классе, нужно выполнить какие-то особые действия. Например, поскольку метод Animal.MoveLeft должен быть общим, чтобы подходить для всех животных, он является, возможно, очень простым, как например "изменение положения так, чтобы голова животного была в направлении X". Однако для класса Cat этого может быть недостаточно. Может потребоваться указать, как Cat двигает лапами и хвостом при поворотах. И если класс Fish или класс Bird уже определен, возможно, потребуется переопределить метод MoveLeft разными способами для каждого из классов. Поскольку можно настроить поведение метода MoveLeft для конкретного класса, в коде, создающем класс и вызывающем его методы, отсутствует отдельный метод для каждого животного. Пока объект наследует от Amimal, вызывающий код может вызывать лишь метод MoveLeft и собственную версию метода объекта.

Конструкторы

В каждом классе существует конструктор — метод с тем же именем, что и у класса. Конструктор вызывается при создании объекта на базе определения класса. Обычно конструкторы задают начальные значения переменных, определенных в классе. Конструкторы не используются, если начальным значением для числовых типов данных буде ноль, "false" для логических типов данных или null для ссылочных типов, поскольку эти типы данных инициализируются автоматически.

Можно определить конструкторы с любым числом параметров. Конструкторы без параметров называется конструкторами по умолчанию. В следующем примере показано определение класса с конструктором по умолчанию и конструктором, принимающим в качестве значения строковое выражение. Затем этот класс использует каждый из них.

Примечание: Если вы работали с C++, то, возможно, вы уже располагаете сведениями о деструкторах. В связи с наличием в C# системы автоматического сбора мусора маловероятно, что вам когда-либо придется применять деструктор, если только класс не использует неуправляемые ресурсы.

class SampleClass

{

string greeting;

public SampleClass()

{

greeting = "Hello, World";

}

public SampleClass(string message) // Перегрузка конструктора SampleClass()

{

greeting = message;

}

public void SayHello()

{

System.Console.WriteLine(greeting);

}

}

class Program

{

static void Main(string[] args)

{

// Использование конструктора по умолчанию

SampleClass sampleClass1 = new SampleClass();

sampleClass1.SayHello();

// Использование конструктора принимающего строковый параметр

SampleClass sampleClass2 = new SampleClass("Hello, Mars");

sampleClass2.SayHello();

}

}

Перегрузка операторов

Перегрузкой называется создание разных методов с одним именем (в предыдущем примере — SampleClass()). Компилятору известно, какой метод следует использовать, поскольку во время каждого создания объекта предоставляется список аргументов (если таковые имеются). Перегрузка может сделать код более гибким и удобочитаемым.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]