Компьютерные технологии (программирование на C#)
Изучение особенностей программирования на платформе .NET. Описание библиотеки классов. Конфликт имен и пространство имен. Статический конструктор и класс. Методы Equals и ReferenceEquals. Способы new и virtual, override переопределния членов класса.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | учебное пособие |
Язык | русский |
Дата добавления | 12.08.2015 |
Размер файла | 134,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Другой способ - описать метод, который может быть изменен у наследника, как виртуальный. Так что, в классе-предке это выглядит как
public virtual void aMethod();
а в классе-наследнике
public override void aMethod();
Поле не может быть виртуальным.
Во втором способе (виртуальный метод) при преобразовании типов, описанном выше, вызываться будет метод класса-наследника. Это существенно, если виртуальный метод вызывается внутри кода, написанного для класса-предка. Так как реальная ссылка в момент выполнения кода будет указывать на экземпляр объекта класса-наследника, то выполняться будет именно версия класса-наследника.
При описании виртуального метода в классе-наследнике (метод с модификатором override) часто бывает необходимо вызвать унаследованную версию виртуального метода. Для этого используется служебное слово base. Так реализация метода aMethod() класса-наследника может иметь вид
public override void aMethod();
{
base.aMethod(); //Вызов метода класса-предка
// …
}
Если дальнейшее перекрытие виртуального метода aMethod() в последующих наследниках не желательно, то в его заголовок следует добавить модификатор sealed
public sealed override void aMethod();//Метод больше не будет перекрываться
Если же, наоборот, метод, описанный как виртуальный, должен быть заменен новой версией виртуального же метода, описание должно иметь вид
public new virtual void aMethod();//Образуется новый виртуальный метод
3.9 Перегрузка операторов
Проверьте, что последняя редакция кода класса LibClasses._1 в модуле LibCode имеет вид
namespace LibClasses
{
public class _1
{
string s="a string";
public override bool Equals(object obj)
{
return obj!=null && GetType()==obj.GetType() && s == ((_1)obj).s;
}
public _1(string s)
{
this.s = s;
}
public _1()
{
}
public void Method()
{
System.Console.WriteLine(s);
}
}
}
Вернемся вновь к редакции класса _2 в модуле CodeFile2 сборки MainExe.
Пусть новая редакция кода класса _2 имеет вид
class _2
{
static LibClasses._1 inst_1 = new LibClasses._1();
static void Main(string[] args)
{
LibClasses._1 inst_1a = new LibClasses._1();
System.Console.WriteLine(inst_1.Equals(inst_1a));
System.Console.WriteLine(inst_1a==inst_1);
System.Console.ReadLine();
}
}
Здесь важна новая строка кода
System.Console.WriteLine(inst_1a==inst_1);
Оператор inst_1a==inst_1 вернет false, так как сравнению подвергаются ссылки. Новый метод Equals при сравнении тех же объектов возвращает true. На лицо явное несоответствие - оператор равенства возвращает результат, отличный от метода Equals! То же несоответствие возникает и в отношении оператора неравенства inst_1a!=inst_1 (проверьте).
Язык C# позволяет перегружать некоторые стандартные операторы, в частности операторы сравнения == и !=.
Вернемся к коду класса LibClasses._1 в модуле LibCode и добавим к нему описания перегруженных операторов == и !=, характерные для класса LibClasses._1 и его наследников.
public static bool operator ==(_1 obj1, _1 obj2)
{
return Equals(obj1,obj2);
}
public static bool operator !=(_1 obj1, _1 obj2)
{
return !Equals(obj1,obj2);
}
Любое описание операторов должно содержать модификаторы public static и использовать служебное слово operator. Проверьте работу новой версии кода.
3.10 Методы GetHashCode и ToString
Вернемся к коду класса _2 сборки MainExe и добавим внутрь метода Main строку
System.Console.WriteLine(inst_1.GetHashCode() == inst_1a.GetHashCode());
Метод GetHashCode возвращает целое число, «нумерующее» экземпляр класса. Естественно считать, что метод GetHashCode, вызванный двумя одинаковыми экземплярами должен возвращать одно и то же целое число. В данном случае это не так. Добавленная строка вернет значение false.
Метод GetHashCode является виртуальным, как и метод Equals, и его следует переопределить вместе с методом Equals и операторами == и !=.
В описание класса LibClasses._1 добавьте код
public override int GetHashCode()
{
return s.GetHashCode();
}
Испытайте новую версию класса LibClasses._1.
Здесь использовалось то, что экземпляры класса LibClasses._1 сравниваются по значению поля s типа System.String. В свою очередь, тип System.String уже имеет переопределенный метод GetHashCode, который возвращает одинаковые числа для одинаковых значений строк.
Метод ToString
Виртуальный метод ToString класса уже использовался нами выше. В классе LibClasses._1 его естественно было бы переопределить, индивидуализируя каждый экземпляр этого класса значением поля-строки s.
Добавочный код к классу LibClasses._1 наберите в виде
public override string ToString()
{
return s;
}
При этом в методе Main класса _2 сборки MainExe с целью тестирования добавьте две строки кода
System.Console.WriteLine(inst_1.ToString());
System.Console.WriteLine(inst_1a.ToString());
Работа проекта в этой редакции должна возвращать в окно две одинаковые строки a string - значения поля s обоих экземпляров.
3.11 Модификатор protected
Следует отметить, что класс LibClasses._1 унаследовал от System.Object не только уже перечисленные статические методы Equals и ReferenceEquals и нестатические методы Equals, GetHashCode, GetType и ToString. Все перечисленные методы имеют модификатор public, поэтому доступны из любого кода. Но есть еще, по крайней мере, один метод, наследуемый от класса System.Object и который виден лишь внутри методов класса LibClasses._1.
Чтобы убедиться в этом, наберите внутри, например, метода Method класса LibClasses._1 ссылку на экземпляр this. (с точкой). Как обычно, IntelliSense предложит список, в который, кроме поля s и уже известных нам методов, входит метод MemberwiseClone. Это нестатический (но не виртуальный) метод, не имеющий параметров и возвращающий объект, являющийся копией вызывающего объекта-оригинала. Фактически метод MemberwiseClone создает новый экземпляр объекта того же класса, что и оригинал, переписывая в него все нестатические поля объекта-оригинала дословно. Если среди полей объекта-оригинала существуют ссылки на объекты других классов, то эти ссылки также дословно переписываются. Такая копия называется «мелкой» (shallow copy). Допустимо копирование, при котором копируются и те объекты, на которые ссылаются поля оригинала. При этом в образованной копии поля-ссылки содержат уже новые ссылки - на копии объектов. Это «глубокое копирование» (deep copy).
Для нас сейчас важно то, что метод MemberwiseClone доступен только изнутри методов класса LibClasses._1 - наследника класса System.Object, потому что он не имеет модификатора public. В то же время метод MemberwiseClone не является private методом класса System.Object. В противном случае он не был бы доступен какому-либо коду вне класса System.Object. Дело в том, что метод MemberwiseClone имеет модификатор доступа protected.
Член класса с модификатором protected доступен только внутри класса, либо внутри его наследников. Существует более сильная версия - модификатор protected internal. Член класса с модификатором protected internal доступен только наследникам, описанным внутри той же сборки, что и класс-предок.
Для проверки работы метода MemberwiseClone наберите новую версию метода Method класса LibClasses._1
public void Method()
{
_1 i_1 = (_1)MemberwiseClone();//Создание копии текущего экземпляра
System.Console.WriteLine(i_1.Equals(this));//Сравнение копии с оригиналом
}
Обратите внимание на необходимость в данном коде оператора преобразования типа (_1). Ведь метод MemberwiseClone возвращает переменную типа object, а описанный экземпляр i_1 относится к типу _1.
Измените также код метода Main класса _2, добавив вызов метода inst_1a.Method.
static void Main(string[] args)
{
LibClasses._1 inst_1a = new LibClasses._1();
inst_1a.Method();
System.Console.ReadLine();
}
Результатом работы последней версии кода будет True в черном окне.
3.12 Деструктор
Класс позволяет любому наследнику иметь специальный нестатический метод, код которого работает непосредственно перед уничтожением объекта - возвратом в кучу выделенной под объект памяти. Это так называемый деструктор.
Описание деструктора, например, класса LibClasses._1 должно выглядеть следующим образом
~_1()
{
}
и не должно содержать ни модификаторов доступа, ни параметров. Деструктор не может быть переопределен, перегружен или унаследован.
Деструктор используется для освобождения ресурсов (открытые ссылки на сайты Интернета, файлы, окна и т.п.), которые, возможно, потребляет экземпляр класса. Описывать пустой деструктор не рекомендуется. Деструктор никогда не вызывается явно из кода приложения. К нему обращается система в тот заранее не определяемый момент времени, когда требуется очистить память от неиспользуемого более экземпляра (вспомните - автоматическая сборка мусора).
3.13 Справочная система
Справку обо всех стандартных пространствах имен (библиотек), классах, их методах и свойствах, о среде, языках и т.д. можно получить из справочной системы MSDN (Microsoft Software Development Network). Есть несколько способов сделать это:
Краткая справка об объекте, который используется в коде программы, может быть получена путем простого наведения курсора на этот объект. Попробуйте, например, навести курсор на метод System.Consol.WriteLine. Среда откроет небольшое окно подсказки с краткой справкой о методе.
Выше уже указывалось, как работать с IntelliSense. Наберите, например, object с точкой. Это приведет к появлению окна со статическими методами этого класса - знакомыми нам методами Equals и ReferenceEquals. Выделение в списке любого метода позволяет получить краткую справку о нем.
Есть команда View.Other Windows.Object Browser…, которая открывает окно с описанием всех пространств имен, классов и их членов. В окне Object Browser также можно получить краткую информацию обо всех элементах библиотеки.
Подробную справку можно получить, используя команды Dynamic Help, Contents…, Index…, Search… меню Help.
Команда Help.Dynamic Help обеспечивает поиск разделов справочной системы по термину, на котором в данный момент находится символ каретки в окне редактора. Эта команда вызывает список разделов, которые содержат определение термина.
Команда Help.Contents… открывает окно с полным содержанием MSDN.
Команда Help.Index… возвращает окно, в котором раздел может быть найден по термину через предметный указатель.
Наконец, команда Help.Search… возвращает полный список разделов, в которых встречается заданный термин.
Для практики в использовании справочной системы найдите через команду Help.Index… описание класса Object и познакомьтесь подробнее с его методами, отработав приведенные в их описании примеры.
3.14 Директивы препроцессора
Добавьте к имеющемуся контейнеру Solution1 новый проект. Для этого откройте окно Solution Explorer (команда View.Solution Explorer) и, щелкнув правой кнопкой над заголовком Solution1 (2 projects), дайте команду Add.New Project…. В открывшемся окне Add New Project выберите шаблон Console Application и дайте ему имя TestProject, щелкнув затем по кнопке OK.
Сохраните файл проекта под именем TestProject командой File.Save Program As….
Среда должна создать новый проект с заготовленным содержанием вида
using System;
using System.Collections.Generic;
using System.Text;
namespace TestProject
{
class Program
{
static void Main(string[] args)
{
}
}
}
Нам часто придется ссылаться на класс System.Console, поэтому добавьте, как это делалось раньше, к списку директив using строку
using C=System.Console;
В дальнейшем C будет служить кратким псевдонимом (alias) класса System.Console.
Добавим в текст еще две строки так, что первые строки кода примут вид
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
using C=System.Console;
#endregion
Директивы препроцессора #region и #endregion ограничивают поименованную сворачиваемую область текста, именуя ее Using directives. В данном случае поименованная область объединяет строки с директивами using, но в общем случае именовать можно любую сворачиваемую область текста. Имя Using directives, конечно, произвольно. Сверните полученный участок кода и посмотрите результат.
Существует ограниченное число директив препроцессора. Все они начинаются со знака # («шарп», или «хэш»). Наиболее распространенными директивами являются
#define - определение какого-либо символа,
#undef - отказ от определения символа,
#if - начало области кода, который транслируется при наличии определенного (или определенных) символов,
#endif - конец этой области
#else и #elif играют роль, подобную #if.
Для примера добавьте к шаблону код, тестирующий работу перечисленных директив так, что полный текст новой версии файла TestProject примет вид
#define Version1
#define Version2
//#undef Version1
//#undef Version2
#region Using directives
using System;
using System.Collections.Generic;
using System.Text;
using C=System.Console;
#endregion
namespace TestProject
{
class Program
{
static void Main(string[] args)
{
#if (Version1 && !Version2)
C.WriteLine("Version1");
#elif (!Version1 && Version2)
C.WriteLine("Version2");
#elif (Version1 && Version2)
C.WriteLine("Version1 and Version2");
#else
C.WriteLine("Version0");
#endif
C.ReadLine();
}
}
}
Попытка активизировать приложение командой Debug.Start Debugging приведет к работе метода Main проекта MainExe - по умолчанию это был стартовый проект. Чтобы сделать стартовым проект TestProject, войдите в окно Solution Explorer, щелкните правой кнопкой над именем проекта TestProject и выберите команду Set as StartUp Project. Шрифт имени проекта должен стать полужирным.
После компиляции среда выделит цветом или шрифтом компилируемые операторы, отличив их от не компилируемой части кода.
Заметьте, что директивы препроцессора #define и #undef можно использовать только в начале компилируемого модуля.
Успешное выполнение кода должно завершиться появлением строки
Version 1 and Version2
Уберите комментаторские символы // (double slash) в строке
//#undef Version1
и вновь испытайте код. Проделайте аналогичные тесты в других сочетаниях.
программирование net класс библиотека
Вопросы для самоконтроля
Тип класса как объект. Статический конструктор. Статический класс.
Нестатический класс и его экземпляр как объект.
Ссылочный тип vs тип-значение.
Перечислите стандартные типы-значения.
Наследование и вызов конструктора.
Статические методы Equals и ReferenceEquals.
Нестатические методы класса object.
Описание виртуальных методов.
Оператор return.
Логические выражения и логические операции.
Преобразование (приведение) типов.
Оператор is vs метод GetType.
Опишите способы new и virtual, override переопределния членов класса при наследовании.
Перегрузка операторов.
Использование модификатора protected.
Деструктор.
Как использовать справочную систему VS?
Директивы препроцессора.
Занятие 4. Строка (класс System.String)
Добавьте к имеющемуся контейнеру Solution1 новый проект. Для этого откройте окно Solution Explorer (команда View.Solution Explorer) и, щелкнув правой кнопкой над заголовком Solution1 (3 projects), дайте команду Add.New Project…. В открывшемся окне Add New Project выберите шаблон Console Application и дайте ему имя StringTestProject, щелкнув затем по кнопке OK.
Сохраните файл проекта под именем StringTestProject командой File.Save Program As….
В целях удобства замените имя класса Program, предложенное средой, именем StringTest и сохраните проект.
Чтобы сделать стартовым проект StringTestProject, войдите в окно Solution Explorer, щелкните правой кнопкой над именем проекта StringTestProject и выберите команду Set as StartUp Project из меню Project. Шрифт имени проекта в окне Solution Explorer должен стать полужирным.
Добавьте, как это делалось раньше, к списку директив using внутри поименованной области строку
using C=System.Console;
4.1 Инициализация экземпляра типа String
Строка есть массив символов.
Наберите в методе Main строку
string s = "abc";
Так выглядит код описания и инициализации экземпляра класса типа string.
После этого наберите s. (с точкой). Инструмент IntelliSense покажет список всех нестатических свойств и методов экземпляров строк, доступных пользователю.
4.2 Индексатор и свойство строки
Свойство
public char this[int index]{get;}
отсутствует в списке нестатических свойств. Оно является примером индексатора (indexer) и возвращает символ (тип char), находящийся на index+1-ом месте в вызывающем экземпляре строки. С помощью индексатора экземпляр строки (как и любого класса с индексатором) представляется массивом.
Наберите в методе Main класса StringTest код, иллюстрирующий работу индексатора
string s = "abc";
C.WriteLine(s[2]);
C.ReadLine();
Результатом должен быть символ c. Обратите внимание, что
индексация символов в строке начинается с нуля (zero based)!
индексатор строки позволяет использовать только метод get (возвратить). Простейшая реализация метода get может иметь вид get {return item[index];}. Предполагаемое поле item (элемент) класса string может хранить символы, из которых состоит строка. Индексатор (или свойство), у которого доступен только метод get, называют «только для чтения» (read-only). Поэтому оператор вида s[1] = 'x'; компилятором будет отвергнут. Попробуйте.
Метод set (установить) в данном объявлении индексатора отсутствует. Но это не значит, что его нет на самом деле. Язык C# допускает описание одного из методов доступа (accessors) set или get со своим модификатором доступа из числа private, protected, internal. При этом оба модификатора доступа должны присутствовать. Уровень доступа метода доступа должен быть ниже уровня доступа самого свойства или индексатора. В данном случае метод set мог бы существовать и иметь один из уровней доступа private, protected, internal - ниже уровня public самого индексатора. Например, метод set мог бы иметь вид private set {item[index]=value;}. Служебное слово value - единственный (неявный) параметр метода доступа set, переносящий значение, которое устанавливается свойством или индексатором.
Длина строки возвращается свойством «только для чтения» Length (длина)
public int Length{get;}
Простейшая реализация метода get может иметь вид get {return length;}. Поле length хранит текущее значение числа элементов строки. Общепринятым является обозначать поля и свойства одинаковыми идентификаторами - у поля первая буква строчная (lowercase letter), а у свойства - прописная (uppercase letter). Поля обычно имеют доступ private, а свойства - public.
Скрывать поля - обычная политика объектно-ориентированного подхода. Свойства регулируют доступ к полям. Если бы у свойства Length был метод доступа set, то он бы мог иметь вид private set {length=value;}.
Испытайте свойство Length кодом C.WriteLine(s.Length);
4.3 Свойства и индексаторы (синтаксис)
Свойства обеспечивают класс возможностью открытой записи и чтения полей, скрывая реализацию проверки входящего значения и получения запрашиваемого значения.
Метод get с помощью оператора return обеспечивает чтение (возврат) значения свойства, а метод set его запись (установку). Эти методы могут иметь различный уровень доступа.
Служебное слово value является неявным параметром метода set, передающим записываемое значение свойства.
Свойство, не имеющее метода set, называется свойством «только для чтения» (read only).
Свойство с точки зрения пользователя выглядит как поле, а с точки зрения программиста, как один или два метода из числа get и set.
Описание свойства F, соответствующего полю f типа type, может выглядеть следующим образом
type f;
//…
public type F
{
set
{
//…
f = value;
}
get
{
//…
return f;
}
}
В отличие от поля свойство нельзя использовать в качестве параметра, передаваемого по ссылке (с модификаторами ref и out) при вызове какого-либо метода. К примеру, метод, описанный как void aMethod(ref type a), нельзя вызвать оператором aMethod (ref F), хотя можно, если позволяет доступ, aMethod (ref f).
Один (но только один) из методов set или get может иметь свой модификатор доступа, более строгий, чем модификатор доступа самого свойства. При этом оба метода должны присутствовать в описании свойства. К примеру, метод set свойства F мог бы иметь модификатор доступа internal, protected internal, protected или private.
Свойство можно перекрыть в наследнике. Для этого используется оператор new. К примеру, если свойство F уже было описано в классе-предке, но должно быть перекрыто в наследнике, должно иметь заголовок
public new type F
Свойство (но не каждый из методов set или get в отдельности) может быть виртуальным. В этом случае в описании свойства используется модификатор virtual, а в классах-наследниках модификатор override.
Свойство может быть абстрактным. Тогда его описание имеет форму
public abstract type F
{
set;
get;
}
Индексаторы
Индексаторы имеют форму свойств-массивов. Они позволяют индексировать объекты. Для пользователя индексированный объект представляется массивом.
Описание индексатора имеет вид
public int this[int index]
{
// get и set методы
}
Методы get и set имеют один дополнительный неявный параметр index.
Тип параметра index не ограничен типом int. Параметр index может иметь, например, тип string.
Число индексов не ограничено. Массив может быть многомерным.
Индексатор может быть перегруженным.
4.4 Конструкторы строк
Простейший способ сконструировать строку из символов - присвоить экземпляру s типа string значение постоянной строки "abc"
string s = "abc";
При этом неявно срабатывает оператор new, выделяющий память под строку s, и конструктор string, инициализирующий s значением "abc".
Конструктор экземпляров строк имеет несколько перегруженных версий, в каждой из которых есть хотя бы один параметр, ссылающийся на символы, формирующие экземпляр строки. Версия конструктора строки без параметра отсутствует.
Например, наберите в методе Main класса StringTest код с явным вызовом конструктора строки
char[] chars = new char[3] { 'a', 'b', 'c' };
string s = new string(chars);
C.WriteLine(s);
C.ReadLine();
Здесь вызвана версия конструктора string(chars) с одним параметром chars типа массива символов. В предыдущей строке кода
Выражение char[] chars описывает массив символов.
Оператор new char[3] вызывает конструктор массива из 3-ех символов.
Список символов { 'a', 'b', 'c' } в фигурных скобках последовательно инициализирует элементы сконструированного массива chars так, как если бы трижды применялся оператор присвоения chars[0]='a'; chars[1]='b'; chars[2]='c';.
Возможен сокращенный вариант описания и инициализации массива
char[] chars = { 'a', 'b', 'c' };
Результат тот же. Компилятор восстанавливает (infer) полный код по числу постоянных в списке.
Попытка сконструировать строку, суммируя символы, т.е. оператором s='a'+'b'+'c' будет отвергнута компилятором «из-за несовместимости объектов целого типа и строк» (char относится к целому типу). Проверьте.
Можно усложнить выражение, набрав s=('a'+'b'+'c').ToString(). В результате вместо строки "abc" получится строка "294", выражающая целое число, равное сумме кодов символов 'a'(97), 'b'(98) и 'c'(99). Опять проверьте.
Складывать надо не символы, но строки
s=”a”+”b”+”c”;
Проверьте.
4.7 Поле Empty
Наберите код, указав лишь имя класса, string. (с точкой). Список, возвращаемый IntelliSense, будет содержать статические поля и методы класса String.
Единственное поле класса String, доступное внешним классам, это статическое поле Empty
public static readonly string Empty;
Поле Empty возвращает пустую (empty) строку. Написать
string s=string.Empty;
равносильно оператору
string s=””;
4.8 Модификатор доступа readonly
Служебное слово readonly требует, чтобы значение поля инициализировалось либо непосредственно в описании, либо внутри конструктора (для статического поля это может быть только статический конструктор, а для нестатического - конструктор экземпляра), но нигде более. При отсутствии инициализации поле с доступом readonly, как и все неинициализированные поля класса, принимает при создании экземпляра значение по умолчанию - null для ссылочного типа и ноль или false для типа-значения.
4.9 Статические методы класса System.String
Метод IsNullOrEmpty возвращает True, если его строка-параметр пустая или ссылка на нее null. Испытайте.
Внутренний пул строк
Два статических метода Equals и ReferenceEquals унаследованы классом String от своего непосредственного предка System.Object.
Наберите в методе Main класса StringTest код
string s1 = "ab", s2 = "ab";
C.WriteLine(string.ReferenceEquals(s1,s2));
C.ReadLine();
Его выполнение возвратит True в черное окно.
Почему? Ведь описаны два различных экземпляра типа string, хотя и совпадающие по значениям! Почему они совпадают по ссылкам, как будто это один экземпляр?
Ответ в том, что среда в целях экономии памяти помещает все «дословно определяемые» в коде экземпляры класса string в выделенную область памяти - внутренний пул (intern pool). Если значения постоянных строк совпадают, то они не дублируются и ссылка на совпадающие строки оказывается одной и той же. Статические методы IsInterned и Intern класса String работают с этим пулом.
«Не изменяемость» строк и класс StringBuilder
Добавьте строку кода
s2 = s2 + string.Empty;
явно не меняющего значения s2. Убедитесь, что ссылки на s1 и s2 теперь не совпадают. Убедитесь также, что результат сравнения s1==s2 или string.Equals(s1,s2) возвращает True. Следовательно, любое изменение значения строки ведет фактически к созданию нового экземпляра объекта типа string. В этом смысле экземпляры типа string являются не изменяемыми (immutable) - любая попытка изменить экземпляр строки приводит к созданию нового экземпляра.
В пространстве имен System.Text существует специальный класс StringBuilder, который позволяет создавать и поддерживать изменяемые (mutable) экземпляры строк, меняя их с помощью таких методов как Append (добавить), Insert (вставить), Remove (убрать), Replace (заменить).
Копирование и объединение строк
Статический метод Copy класса string создает точную копию экземпляра строки с другой ссылкой. Проверьте его работу, скажем, оператором
C.WriteLine(string.ReferenceEquals(s1, string.Copy(s1)));
Перегруженные версии метода Concat (объединить в цепочку) формируют строку из отдельных фрагментов - отдельных строк и строчных представлений других объектов. Действие такое же, как у оператора сложения. Испытайте, например, версию «3 строки»
C.WriteLine(string.Concat("Hello", " C#", "!"));
или еще одну, «4 объекта» (целого типа)
C.WriteLine(string.Concat(2,0,0,5));
Две версии метода Join образуют строку из массива (или указанного фрагмента массива) других строк, вставляя между элементами массива строку-сепаратор. Например, код
C.WriteLine(string.Join("!!!",new string[]{"Okay","All right","Deal?"})); должен возвратить строку
Okay!!!All right!!!Deal?
Вторым параметром метода Join является массив строк string[] любого размера - тот же тип, как параметр метода Main.
Оператор new string[]{"Okay","All right","Deal?"}
создает экземпляр массива из трех строк (вызывает соответствующий конструктор) и
заполняет его (инициализирует) строками (элементами массива), перечисляемыми через запятую в фигурных скобках.
В этом контексте сократить оператор new string[]{"Okay","All right","Deal?"} до {"Okay","All right","Deal?"} уже нельзя, как при описании массива. Ведь в данном случае созданный экземпляр является одновременно параметром метода.
4.10 Форматирование строк
Каждый класс наследует от System.Object и, при необходимости, переопределяет виртуальный метод ToString, обеспечивая текстовое представление своих объектов. Объекты классов ссылочного типа за исключением String возвращают имя своего типа. Классы типов-значений обычно определяют несколько версий метода ToString, обеспечивая разную текстовую форму (format) представления своих объектов. Текстовое представление объектов типов-значений называют в данном контексте форматированием (formatting).
Процесс, обратный форматированию, состоит в лексическом анализе (parsing) текста строки с целью воссоздания объекта.
Методы композиционного форматирования
Несколько версий статического метода Format класса String формируют строку из заданных объектов путем композиционного форматирования. Основным параметром метода Format является комбинированная строка. В ней кроме чисто текстовой, комментирующей части находятся так называемые индексированные заполнители (indexed placeholders). Например, код
int i=13;string s = string.Format("i={0}", i);
C.WriteLine(s);
C.ReadLine();
вернет строку i=13. Здесь комбинированная строка содержит комментарий i= и индексированный заполнитель {0}. Индексированный заполнитель указывает на то, что объект (в данном случае типа int), стоящий первым (отсюда значение 0 индекса) в последующем списке параметров, должен быть форматирован в строку и эта строка должна быть поставлена на место заполнителя {0}.
Испытайте этот код для объектов разных типов. Замените, например, первую строку кода строкой вида
object o = new object();string s = string.Format("o={0}", o);
или
string s = string.Format("Now {0}", DateTime.Now);
Полезный комментарий. У класса System.DateTime типа-значения (struct) есть статическое свойство Now. Это свойство возвращает объект также типа System.DateTime. Объект, возвращаемый свойством Now, содержит настоящий момент времени.
Испытайте теперь код с другой версией метода Format, где вторым параметром является массив объектов
int i1 = 1, i2 = 2;
C.WriteLine(string.Format("i1={0};i2={1}",new object[2] {i1, i2}));
Результат i1=1;i2=2
Замените заполнитель {1} заполнителем {0}. Убедитесь, что результат стал i1=1;i2=1.
В общем случае индексированные заполнители могут иметь вид
{индекс [,выравнивание][:строка формата]}
Здесь в квадратных скобках указаны не обязательные параметры индексированного заполнителя, которые не использовались в предыдущих примерах:
Параметр «выравнивание» (alignment) должен быть целым числом со знаком или без знака. Значение выравнивания есть требуемое число символов в текстовом представлении выводимого объекта. Если реальное число символов строки больше, то значение выравнивания игнорируется. Если параметр «выравнивание» положительный, то выводимая строка выравнивается по правому полю, если отрицательный - по левому.
Чтобы уяснить роль параметра «выравнивание», наберите строку кода
C.WriteLine(string.Format("i1=|{0,10}|;i2=|{1,-5}|",new object[2] {i1, i2}));
Результат i1=| 1|;i2=|2 |
Параметр «строка формата» содержит условные символы, указывающие на форму текстового выражения объекта.
Добавьте строки формата c и p1 в предыдущую строку кода так, чтобы она имела вид C.WriteLine(string.Format("i1=|{0,10:c}|;i2=|{1,-5:p1}|",i1,i2));
(одна из версий метода Format, использованная здесь, допускает в качестве параметров два объекта, а не массив объектов, как в предыдущем примере).
Результатом должна быть строка текста
i1=| 1,00р.|;i2=|200,0%|
Здесь р. - сокращение от «рубль», так как строка формата c указывает, что речь идет о валюте (currency). Строка формата p1 представляет запись целого числа в процентах после умножения на 100.
Еще пример
C.WriteLine(string.Format("Today {0:M}", DateTime.Today));
C.WriteLine(string.Format("Now {0:F}", DateTime.Now));
Результатом первой строки должна быть текущая дата, а второй - дата и время. Строками формата являются буквы M и F (от month - месяц и full - полный формат даты и времени).
Строка формата зависит от типа объекта. В частности, для численных типов объекта строка формата имеет вид Axx. Здесь A - так называемый спецификатор формата. Например, если A это символ D или d, то целый тип форматируется в свое обычное цифровое (digital) представление. Необязательное целое число xx в интервале 0..99, может следовать за спецификатором формата. Оно определяет требуемое число значащих цифр. Например, d5 указывает, что выводимым параметром должно быть целое число с пятью значащими цифрами. Для вывода вещественных чисел спецификаторами формата являются символы F или f (float) и e или E (exponent).
Испытайте разные строки формата, набрав, например, строки кода
C.WriteLine("Число пи={0}",Math.PI);
C.WriteLine("Число пи={0:g}",Math.PI);
и, заменяя, затем, спецификатор g другими строками формата, скажем f10, F2, e15, E0.
Обратите внимание в частности на то, что спецификатор формата g (general) используется по умолчанию, то есть в том случае, когда строка формата опущена. То же и в формате объектов типа DateTime.
Из последнего примера видно, что комбинированную строку и список форматируемых объектов можно использовать не только в качестве параметров метода Format, но и метода WriteLine класса Console. Класс StringBuilder также имеет несколько версий метода форматирования AppendFormat.
4.11 Метод с нефиксированным числом параметров
В примерах с применением метода string.Format использовались различные версии этого метода. В одной из них метод имеет два параметра - строка форматирования и массив объектов. Обратите внимание, что в описании этой версии второй параметр - массив объектов, описан в форме params object[]args.
Служебное слово params позволяет пометить параметры метода, число которых не фиксировано. Тип этих параметров должен быть один и тот же. Если метод имеет несколько параметров, то параметры params могут быть только последними в списке. Формальным параметром, допускающим служебное слово params, должен быть одномерный массив.
Наберите в классе StringTest метод
static void UseParams(params char[] Params)
{
foreach (char ch in Params)
C.Write(ch);
}
В методе Main наберите код
UseParams( 'H','e','l','l','o',' ','C','#','!');
Посмотрите результат.
Если опустить params в описании метода UseParams, то фактическим параметром метода UseParams может быть только массив символов.
Тогда вызов UseParams в методе Main код должен иметь вид
UseParams(new char[] { 'H', 'e', 'l', 'l', 'o', ' ', 'C', '#', '!' });
Отсюда следует, что метод string.Format можно применять, например, в форме
int i1 = 1, i2 = 2, i3 = 3, i4 = 4;
C.WriteLine(string.Format("i1={0};i2={1};i3={2};i4={3}", i1, i2, i3, i4));
Версии с 4-мя объектами у метода string.Format нет. Проверьте этот код.
Одна из версий метода Format позволяет использовать пользовательский (custom) способ форматирования объектов - например, целых чисел в бинарной форме, либо комплексных чисел.
4.12 Класс Math
Это закрытый для наследования (sealed) класс - прямой наследник класса Object. Класс Math предлагает только статические поля (поле PI - число «пи» и поле E - число «е», основание натуральных логарифмов) и методы, часто используемые в математических расчетах:
Несколько версий методов Sign, Abs, Min и Max, возвращающие для всех числовых типов, соответственно, знак, абсолютную величину числа и минимальное и максимальное из двух предложенных чисел.
Алгебраические функции:
Экспонента Exp, степень Pow и квадратный корень Sqrt числа;
тригонометрические функции Sin, Cos, Tan;
обратные тригонометрические функции ASin, ACos, ATan, ATan2 (функция ATan2 возвращает арктангенс отношения двух параметров - y и x-координат точки);
логарифмические функции Log (2 версии - натуральный логарифм и логарифм с произвольным основанием), Log10 (десятичный логарифм);
гиперболические функции Sinh, Cosh, Tanh.
Все параметры и возвращаемые объекты этих функций - 8-ми байтовые числа с плавающей запятой типа double.
Метод BigMul возвращает произведение двух 4-байтовых (Int32) целых чисел в форме целого числа 8-байтового типа Int64.
Методы округления чисел
По две версии методов Ceiling и Floor (для аргументов типа double и decimal) возвращают, соответственно, ближайшие сверху и снизу целые числа (говорят, округление к «положительной» и, соответственно, «отрицательной бесконечности»). Тип возвращаемого числа совпадает с типом параметра (double или decimal).
Восемь версий метода Round округляют числа типа double и decimal до ближайшего числа без учета и с учетом точности округления (до целого или до вещественного числа определенной точности), учитывая при этом способ округления полу целых чисел (от нуля или до ближайшего четного числа).
Две версии метода Truncate для аргументов типа double и decimal действуют аналогично Ceiling и Floor, но округляют число в сторону нуля.
Методы округления возвращают числа типа, заданного аргументом (double и decimal соответственно). Испытайте методы округления на примерах.
Методы получения остатка от деления
Метод IEEERemainder возвращает остаток типа double от деления двух чисел того же типа.
Две версии метода DivRem (для типов int и long) возвращают целую часть результата деления двух целых чисел и, в одном из параметров, целый остаток от их деления.
Представляет интерес описание метода
public static int DivRem(int a, int b, out int result);
Два первых параметра описывают делимое a и делитель b, а последний result - остаток от деления. Параметр result имеет модификатор out («параметр выхода»), указывающий на то, что
result - параметр по ссылке, то есть в result возвращается значение, полученное внутри DivRem.
result не обязан иметь какое-либо первоначальное значение.
Заметим, что в C# есть специальная бинарная операция % - остаток от деления нацело двух чисел целых или вещественных типов.
Вопросы для самоконтроля
Как описывается индексатор класса string?
Структура описания свойств и индексаторов.
Как описываются свойства «только для чтения»?
Как описывается массив символов?
Что означает модификатор readonly?
Что означает «не изменяемость» строк?
Опишите способ форматирования с помощью комбинированной строки и структуру индексированного заполнителя.
Как описывается метод с нефиксированным числом параметров?
Опишите члены стандартного класса Math. Что означает модификатор sealed?
Занятие 5. Интерфейсы. Полиморфные классы и методы
Заголовок описания класса System.String имеет вид
public sealed class String : IComparable, ICloneable, IConvertible, IComparable<string>, IEnumerable<string>, IEnumerable, IEquatable<string>;
Служебное слово sealed («запечатанный») означает (как и в случае класса Math), что класс System.String не может иметь наследников.
После двоеточия находится список имен, начинающихся буквой I. Это интерфейсы (interface) - классы с нереализованными методами. В общем случае правила C# требуют, чтобы в описании класса class или struct после имени типа и двоеточия указывалось имя одного класса-предка и имена тех интерфейсов, методы которых класс обязывается реализовать. Если имя класса-предка не указывается, то предком является класс System.Object. Отсюда заключаем, что класс System.String является прямым наследником класса Object и реализует методы интерфейсов, перечисленных в списке (говорят также «наследует интерфейсы»).
5.1 IComparable (сравнимый)
Первый в списке интерфейс System.IComparable предлагает к реализации один метод CompareTo. Описание интерфейса System.IComparable имеет вид
public interface IComparable
{
int CompareTo(object obj);
}
Члены интерфейса не должны иметь модификаторов доступа. Не явно все члены интерфейса имеют доступ public. Члены интерфейса также не могут быть static, virtual, override или abstract.
Метод CompareTo реализован классом String с заголовком
public int CompareTo(object obj);
Методы интерфейсов, реализуемые классом, должны иметь модификатор доступа public и совпадать по числу и типу параметров и возвращаемому типу (сигнатура).
Проверьте работу метода String.CompareTo, набрав в методе Main класса StringTest код
object o = null;
C.WriteLine("b".CompareTo(o));
Результатом должна быть единица - в сравнении с null любая строка (и, вообще, любой объект) возвращает положительную единицу - результат сравнения есть «больше чем» (greater than).
Испытайте также значения объекта o, равные "b", "a", "c", убедившись, что в первом случае результатом будет 0 - строки равны (equal), затем 1 ("b" «больше» "a") и, наконец, -1 ("b" «меньше» "c"). Метод сортирует строки по алфавиту.
Возможны и другие способы сортировки строк - по кодам символов, из которых состоит строка, с учетом или без учета различий строчных и прописных букв, в зависимости от порядка выделенных номеров символов (подстрок) и т.д. Для этого в классе String существует несколько версий статических методов Compare и CompareOrdinal.
5.2 Работа с исключительными ситуациями (exceptions)
Замените последнюю версию строки описания объекта o строкой
object o = new object();
и вновь активизируйте приложение командой Debug.Start Debugging.
Возникает ошибка времени выполнения (runtime error) типа “Object must be of type String”, вызванная тем, что фактическим параметром метода CompareTo оказался объект, «не сводимый к строке». В этом случае метод CompareTo создает (throw) экземпляр класса исключительной ситуации (сокращенно, ИС) типа System.ArgumentException - наследника корневого класса System.Exception. Среда прерывает выполнение кода, сообщая, что эта исключительная ситуация осталась без реакции со стороны кода (unhandled).
Язык C# позволяет реагировать на появление исключительных ситуаций. Для иллюстрации отредактируйте код метода Main так, чтобы он имел вид
string s = "b";
object o = new object();
try
{
C.WriteLine(s.CompareTo(o));
}
catch (Exception e)
{
C.WriteLine(e);
}
C.ReadLine();
Внутрь «блока попытки» try { } помещен вызов метода CompareTo, который может создать (throw) исключительную ситуацию (этот факт указывается в описании метода в справочной системе).
При возникновении исключительной ситуации управление передается вверх по стеку в ближайший «блок обнаружения» catch (Exception e){}. В блок catch программист помещает операторы, реагирующие на обнаруженное исключение. При этом экземпляр созданного объекта (в данном случае объекта класса ArgumentException) передается переменной e того же типа или типа предка (в данном случае типа Exception). При перемещении вверх по стеку, информация о маршруте перемещения накапливается в свойстве Message объекта e.
Оператор C.WriteLine(e) (сокращенная запись от WriteLine(e.Message); попробуйте) печатает сообщение, перенесенное объектом e
System.ArgumentException: Object must be of type String.
at System.String.CompareTo(Object value)
at StringTestProject.StringTest.Main(String[] args) in
далее следует конкретный маршрут к исполняемому модулю StringTest и номер строки кода.
Можно написать код, который должен выполняться после потенциального источника ИС вне зависимости от того, возникла ИС или нет. Для этого после блока catch следует открыть еще один блок, озаглавив его служебным словом finally. Наберите в предыдущем примере сразу после блока catch (перед C.ReadLine();) код
finally { C.WriteLine("Always done"); }
Проверьте его работу при возникновении ИС и, когда ошибка не возникает (к примеру, замените строку с объявлением объекта o строкой object o = "c";).
Источником исключительной ситуации являлся в данном случае метод CompareTo, и созданный им объект типа System.ArgumentException принял сообщение (Message) Object must be of type String, напечатанное в первой строке текста.
Если добавить в «блок попытки» try перед строкой C.WriteLine(s.CompareTo(o));
оператор вида
if (!(o is string))
throw new ArgumentException("Object is not of type String");
то до входа в метод CompareTo дело не дойдет (проверьте).
Примерно такой оператор находится внутри метода CompareTo, и именно так создается экземпляр объекта исключительной ситуации нужного типа.
Оператор if, использованный в последнее строке, относится к условным операторам языка C#. Вслед за служебным словом if в круглых скобках располагается выражение, возвращающее логическое значение true или false. Далее находится оператор (или блок операторов {}), выполняющийся по значению true.
Класс String, реализовав интерфейс IComparable, делает свои объекты сравнимыми по определенным характеристикам.
5.3 ICloneable (клонируемый)
Интерфейс System.ICloneable имеет вид
public interface ICloneable
{
object Clone();
}
и предлагает для реализации единственный метод Clone, дополняющий рассмотренный выше метод Object.MemberwiseClone.
Класс String реализует метод
public object Clone()
таким образом, что возвращается ссылка на тот же экземпляр класса String. Проверьте этот факт, набрав внутри метода Main рабочего проекта код
string s = "a",sClone;
sClone = (string)s.Clone();
C.WriteLine(string.ReferenceEquals(s, sClone));
C.ReadLine();
Результатом должно быть значение True. Следовательно, экземпляры s и sClone совпадают полностью.
Обратите внимание на преобразование типов: s.Clone возвращает объект типа object и его следует явным вызовом оператора () преобразования типа, в данном случае(string), преобразовать к типу string.
Класс String, реализовав интерфейс ICloneable, позволяет клонировать свои объекты.
5.4 IConvertible (преобразуемый)
Интерфейс System.IConvertible предлагает для реализации методы, преобразующие вызываемый объект в объект другого типа, поддерживаемого .NET. Это типы Boolean, Byte, Char, DateTime, Decimal, Double, Int16, Int32, Int64, SByte, Single, String, UInt16, UInt32 и UInt64. Описание интерфейса имеет вид
public interface IConvertible
{
TypeCode GetTypeCode();
object ToType(Type conversionType, IFormatProvider provider);
bool ToBoolean(IFormatProvider provider);
//Далее - методы, подобные ToBoolean, для остальных типов .NET
}
Тип TypeCode, возвращаемый методом GetTypeCode, есть нумератор enum, перечисляющий стандартные типы .NET
public enum TypeCode {Boolean, Byte, Char, DateTime, DBNull, Decimal, Double, Empty, Int16, Int32, Int64, Object, SByte, Single, String, UInt16, UInt32, UInt64}
здесь DBNull - отсутствие данных в поле базы данных, Empty - ссылка null.
Метод ToType имеет первым параметром объект conversionType типа Type, в который следует перевести вызывающий объект. Тип Type - класс из пространства имен System.Reflection. Методы и свойства класса Type описывают («отражают» - reflect) общие характеристики типов, используемых в .NET. Второй параметр provider метода ToType имеет тип IFormatProvider - интерфейс из пространства имен System;
интерфейс IFormatProvider имеет единственный метод GetFormat(Type formatType), возвращающий объект, который отвечает за форматирование данных типа formatType.
Метод GetTypeCode реализован классом String и доступен для вызова любым экземпляром класса String. Проверьте это с помощью кода
string s = "10:59:07,May 1,2005";
C.WriteLine(s.GetTypeCode());
Результатом будет имя типа вызывающего объекта String.
Наберите еще одну строку
C.WriteLine(((IConvertible)s).ToDateTime((IFormatProvider)(new
System.Globalization.DateTimeFormatInfo())));
В черное окно будет выведена строка даты-времени
01.05.2005 10:59:07
5.5 Явная реализация методов интерфейса
Методы ToType, ToDateTime и т.д. интерфейса IConvertible реализованы в классе String с заголовками особой формы, явно указывающей на их принадлежность к интерфейсу IConvertible
object IConvertible.ToType(Type conversionType,IFormatProvider provider);
DateTime IConvertible.ToDateTime (IFormatProvider provider);
Явное описание методов интерфейса в реализующем классе не должно сопровождаться модификаторами доступа типа public и т.п.
По правилам C# - методы интерфейса, описанные в реализующем классе с явным указанием типа интерфейса можно вызвать только экземпляром того же типа интерфейса (в данном случае интерфейса IConvertible). Поэтому для вызова метода ToDateTime понадобился фрагмент кода ((IConvertible)s).ToDateTime, где явно указано преобразование ссылки на объект s типа string в ссылку на объект типа интерфейса IConvertible. Другой способ приведения типов может быть реализован с помощью оператора as (как). Выражение (IConvertible)s можно заменить выражением s as IConvertible, что означает дословно «рассматривай ссылку на объект s, как ссылку на объект типа IConvertible». Проверьте.
Параметром метода ToDateTime является объект типа IFormatProvider. Такого типа объект может быть получен только из класса, реализующего интерфейс IFormatProvider.
В данном примере этим классом является System.Globalization.DateTimeFormatInfo.
Код (IFormatProvider)(new System.Globalization.DateTimeFormatInfo()) создает экземпляр класса System.Globalization.DateTimeFormatInfo и преобразует его тип в IFormatProvider.
Класс String, реализовав интерфейс IConvertible, делает свои объекты преобразуемыми в объекты других типов.
На практике для преобразования строк к значениям переменных конкретных типов рекомендуется использовать статические методы класса System.Convert. Действительно, гораздо проще выглядит строка кода
C.WriteLine(Convert.ToDateTime(s));
Проверьте ее работу.
5.6 Интерфейсы (синтаксис)
Интерфейсы подобны абстрактным классам.
Интерфейсы не могут иметь экземпляров.
Интерфейсы могут быть членами пространства имен или классов.
Членами интерфейса могут быть только свойства, индексаторы, методы и события (event). Интерфейс не может иметь полей. Члены интерфейса автоматически имеют доступ public и модификатор доступа в их описании не указывается. Интерфейс не содержит реализации своих методов.
Интерфейс может наследовать один или более интерфейсов.
Класс может наследовать один или более интерфейсов. В этом случае любой не абстрактный класс должен реализовать все члены интерфейсов. Все члены класса, реализующие члены интерфейса, должны иметь то же имя, ту же сигнатуру, модификатор доступа public и должны быть нестатическими.
Члены интерфейса могут быть реализованы классом явно. Члены интерфейса, реализованные явно, могут быть доступны только экземпляру интерфейса, но не реализующего класса. При этом тип объекта реализующего класса преобразуется в тип интерфейса.
5.7 IEnumerable (перечислимый)
Интерфейс System.Collections.IEnumerable
public interface IEnumerable
{
IEnumerator GetEnumerator();
}
предлагает для реализации метод GetEnumerator, возвращающий объект типа IEnumerator (нумератор).
В свою очередь интерфейс System.Collections.IEnumerator имеет вид
public interface IEnumerator
{
object Current {get;};
bool MoveNext();
void Reset();
}
Current (текущий элемент) - предлагаемое для реализации свойство типа object. Интерфейс IEnumerator требует лишь реализации метода get (возвратить) свойства Current - свойство должно позволять читать значение поля current реализующего объекта, но не обязано в это поле писать. Простейшая реализация метода get может иметь вид get {return current;}.
MoveNext - метод перемещения к следующему элементу; возвращает false, если следующего элемента нет;
Reset - метод перемещения к началу; должен устанавливать значение current перед первым элементом.
Класс String реализует метод GetEnumerator, используя в качестве «реализатора» интерфейса IEnumerator класс System.CharEnumerator
public CharEnumerator GetEnumerator();
Испытайте код
string s = "abc";
CharEnumerator ce = s.GetEnumerator();
ce.Reset();
while (ce.MoveNext()) {C.WriteLine(ce.Current);}
Убедитесь, что результатом будут символы, из которых состоит строка s.
5.8 Цикл foreach
Класс CharEnumerator позволяет перечислять символы в строке. Испытайте его работу кодом
string s = "Hello C#!";
...Подобные документы
Концепция объектно-ориентированного программирования. Объектно-ориентированные языки программирования: Smalltalk, Object Pascal, CLOS и C++. Понятие "Объект" и "Класс". Управление доступом к элементам данных классов. Определение функций-членов класса.
реферат [24,5 K], добавлен 28.10.2011Класс как специальная структура для хранения разнотипной информации о физическом объекте. Порядок объявления класса, его специальные элементы-функции. Создание указателя на объект. Особенности конструкторов и деструкторов. Собственные операции класса.
курсовая работа [483,1 K], добавлен 07.04.2014Изучение структуры доменных имен и описание возможностей их системы по использованию символьных наименований узлов в IP-сетях. Записи ресурсов домена и функции сети по расширению имен и зон обратного просмотра. Делегирование ответственности за домены.
презентация [104,2 K], добавлен 25.10.2013Оценка функциональных возможностей стандартных классов представления данных на примерах использования избранных методов ("detect: ifNone:" класса Set, "to:by:do:" класса Number и "copy: ReplaceFrom: to: with:" класса OrderedCollection), их тестирование.
лабораторная работа [1,1 M], добавлен 14.10.2012Создание класса wind, характеризующего ветровой режим, и программы, демонстрирующей применение разработанного класса. Программный модуль на языке программирования C++ в среде программирования C++Builder6/0, демонстрирующая работу с классом wind.
курсовая работа [123,5 K], добавлен 24.06.2010Изучение принципов объектно-ориентированного программирования, в котором основными концепциями являются понятия классов и объектов. Свойства этого вида программирования: инкапсуляция, полиморфизм, наследование. Описание класса. Конструкторы и деструкторы.
презентация [74,8 K], добавлен 14.10.2013Механизм классов в C++. Инициализация внутреннего объекта с помощью конструктора. Управление доступом к классу. Защищенные члены класса. Графические средства компилятора Borland C 3.1. Библиотека стандартных шаблонов. Реализация и использование класса.
курсовая работа [2,7 M], добавлен 16.05.2012Разработка программы, выполняющей обработку базы данных, элементами которой являются объекты класса Student. Организация пользовательского диалога для ввода информации и просмотра объектов. Определение классов и глобальных имен. Инструкция программиста.
контрольная работа [18,4 K], добавлен 13.10.2013Освоение методики проектирования программных комплексов на базе объектно-ориентированного программирования. Описание понятий класс, конструктор и деструктор, наследование простое и множественное. Реализация объектной модели на языке программирования с++.
курсовая работа [468,5 K], добавлен 11.12.2011Причины возникновения объектно-ориентированного программирования. Графическое представление классов; их отличия от других абстрактных типов данных. Типы абстракции, используемые при построении объекта. Сущность инкапсуляции, наследования и полиморфизма.
контрольная работа [222,1 K], добавлен 04.06.2014Основные понятия объектно-ориентированного программирования в PHP5. Структурный и объектно-ориентированный подход. Класс как абстрактный тип. Реализация класса. Конструкторы и деструкторы. Функция l_visited_style изменение стиля посещенных ссылок.
курсовая работа [433,2 K], добавлен 13.06.2008Разработка структуры класса "Экран курсового проектирования", которая будет основой для хранения информации о студентах, выполняющих курсовые работы. Реализация визуального приложения для тестирования иерархии классов на языке программирования С++.
курсовая работа [3,3 M], добавлен 18.03.2011Компьютерные сети: основные понятия, преимущества, проблемы, история развития. Разработка технологии межсетевого взаимодействия. Протоколы, службы и сервисы, мировая статистика Интернета. Адресация узлов сети. Система доменных имен. База данных DNS.
презентация [3,9 M], добавлен 25.11.2013Создание программы для обработки информации об объектах предметной области "Бытовая техника" в среде визуального программирования C++. Иерархия родственных классов. Описание логической структуры программы. Реализация файлового ввода/вывода данных.
курсовая работа [711,4 K], добавлен 27.07.2014Принципы работы с графикой средствами GDI+. Пространство имен и служебные типы System. Drawing. Возможности класса Graphics. Использование программного компонента "Таймер". Графическое Windows-приложение "Созвездие", его структура и элементы, функции.
курсовая работа [348,0 K], добавлен 03.03.2016Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).
курсовая работа [29,7 K], добавлен 29.10.2011Назначение и сущность системы доменных имен (DNS) и службы имен Интернет для Windows (WINS). Запросы, зоны и инструменты DNS. Служебные программы командной строки. Установка и настройка DNS-сервера. Записи ресурсов узлов, псевдонимов и размещения службы.
презентация [553,6 K], добавлен 10.11.2013Классы, объекты и объектные ссылки. Особенности статических методов. Конструкторы, специальные переменные, наследование. Создание объектов внутренних классов. Соглашения об именовании. Некоторые методы класса Object. Абстрактные классы и атрибуты.
лекция [130,6 K], добавлен 21.06.2014Описание классов данных. Основное меню программы. Добавление и удаление объектов. Вывод устройств хранения в указанном ПК. Устройство хранения, класс ноутбук, класс жёсткий диск, класс персональный компьютер, класс планшет и класс Flash-память.
курсовая работа [1,8 M], добавлен 30.03.2014Понятия шаблонов функции и класса, правила описания на языке С++. Разработка и отлаживание в среде программирования программ, содержащих шаблоны функций и классов. Шаблон функции square, возвращающей квадрат переменной. Создание шаблона класса массива.
лабораторная работа [162,6 K], добавлен 25.05.2013