|
|||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Свойства-массивы
Кроме обычных свойств в объектах существуют свойства-массивы (array properties). Свойство–массив – это индексированное множество значений.
type TDelimitedReader = class ... FItems: array of string; ... function GetItem(Index: Integer): string; ... property Items[Index: Integer]: string read GetItem; end; function TDelimitedReader.GetItem(Index: Integer): string; begin Result:= FItems[Index]; end;
В описании свойства-массива разрешено использовать только методы, но не поля. В этом состоит отличие свойства-массива от обычного свойства.
Основная выгода от применения свойства-массива – возможность выполнения итераций с помощью цикла for, например: for i:= 0 toReader.ItemCount - 1 do Writeln(Reader.Items[i]);
Свойство-массив может быть многомерным. В этом случае методы чтения и записи элементов должны иметь столько же индексных параметров соответствующих типов, что и свойство-массив. Свойства-массивы имеют два важных отличия от обычных массивов: 1) их индексы не ограничиваются диапазоном; 2) индексы могут иметь любой тип данных, а не только Integer:
Reader.Items['FirstName']:= 'Alexander';
Операции целиком со всем свойством-массивом запрещены; разрешены операции только с его элементами. Свойство-массив можно сделать основным свойством объектов данного класса. Для этого в описание свойства добавляется слово default: type TDelimitedReader = class ... Property Items[Index: Integer]: string readGetItem; default; ... end;
Такое объявление свойства Items позволяет рассматривать сам объект класса TDelimitedReader как массив и опускать имя свойства-массива при обращении к нему из программы, например:
For i:= 0 to Reader. ItemCount - 1 do Writeln(Reader [i]);
Следует помнить, что только свойства-массивы могут быть основными свойствами объектов; для обычных свойств это недопустимо.
Один и тот же метод может использоваться для получения (установки) значений нескольких свойств одного типа. В этом случае каждому свойству назначается целочисленный индекс, который передается в метод чтения (записи) первым параметром.
type TDelimitedReader = class ... property FirstName: string index 0 read GetItem; property LastName: string index 1 read GetItem; property Phone: string index 2 read GetItem; end;
Обращения к свойствам FirstName, LastName и Phone заменяются компилятором на вызовы одного и того же метода GetItem, но с разными значениями параметра Index: var Reader: TDelimitedReader; ... Writeln(Reader.FirstName); // Эквивалентно: Writeln(Reader.GetItem(0)); Writeln(Reader.LastName); // Эквивалентно: Writeln(Reader.GetItem(1)); Writeln(Reader.Phone); // Эквивалентно: Writeln(Reader.GetItem(2));
Индексаторы C# Индексаторы очень похожи на свойства. Формально синтаксис определения индексатора таков:
Следует отметить, что доступ к индексатору осуществляется посредством сигнатуры, в отличие от свойства, доступ к которому осуществляется посредством имени. Сигнатурой индексатора считаются число и тип формальных параметров. Тип самого индексатора и имена параметров в сигнатуру не входят. Естественно, в классе не может быть двух индексаторов с одинаковой сигнатурой. К тому же, индексатор не считается переменной и не может быть передан в качестве ref или out параметра. Индексаторы дают возможность вашим классам использовать их как массивы. Внутри класса вы управляете данными, как вам захочется. Несмотря на внутреннюю реализации класса, эти данные могут быть получены через последовательность с использованием индексаторов.
using System; using System.Collections; using System.Collections.Generic; namespace IndexatorSimple { class Program { class Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } public ArrayList arPeople = new ArrayList(); public Person this[int index] { get { return (Person)arPeople[index]; } set { arPeople.Insert(index, value); } } } static void Main(string[] args) { Person person = new Person(); person[0] = new Person { Name = "John", Surname = "Lenon", Age = 53 }; person[1] = new Person { Name = "Ashly", Surname = "Menoton", Age = 27 }; Person p1 = new Person { Name = "Pol", Surname = "Sarmey", Age = 18 }; person[2] = p1; for (int i = 0; i < 3; i++) { Console.WriteLine("{0} {1} {2}", person[i].Name, person[i].Surname, person[i].Age); } Console.ReadLine(); } } } Сначала определяется класс Person в котором объявлены три свойства Name, Surname и Age, потом объявляется список arPeople типа ArrayList. Следующий член класса и есть индексатор, который определен с ключевым словом this и квадратными скобками public Person this[int index]. Метод принимает единственный параметр позиции - index. Как вы уже видите реализация индексатора такая же, как у свойств. В Main() объявляется объект person, потом с помощью индексатора добавляются члены к этому объекту. Вывод результата в консоль такой. John Lenon 53Ashly Menoton 27Pol Sarmey 18
В качестве аргумента индексатора может быть не только переменная типа int, но и любой другой тип. using System; using System.Collections; using System.Collections.Generic; namespace IndexatorSimple { class Program { class Person { public string Name { get; set; } public string Surname { get; set; } public int Age { get; set; } public Dictionary arPeople = new Dictionary(); public Person this[string name] { get { return arPeople[name]; } set { arPeople[name] = value; } } } static void Main(string[] args) { Person person = new Person(); person["John"] = new Person {Name="John", Surname = "Lenon", Age = 53 }; person["Ashly"] = new Person {Name="Ashly", Surname = "Menoton", Age = 27 }; Person p1 = new Person {Name="Pol", Surname = "Sarmey", Age = 18 }; person["Pol"] = p1; string[] names = new string[] { "John", "Ashly", "Pol" }; for (int i = 0; i < names.Length; i++) { Console.WriteLine("{0} {1} {2}", person[names[i]].Name, person[names[i]].Surname, person[names[i]].Age); } Console.ReadLine(); } } } Расширение класса путем создания производного класса. Термин «наследование». Существование «прародителя» всех классов. Перекрытие элементов класса в производных классах. Совместимость объектов различных классов. Контроль и преобразование типов. Информация о типе времени выполнения программы.
Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.01 сек.) |