Визначення інтерфейсів і реалізація оболонки в Visual C # (Sharp)

У NET існують потоки даних двох типів: довічних і текстових Типи Textwriter і TextReader використовуються для роботи з потоками текстових даних Як було продемонстровано типом stringReader, при роботі з потоками текстами даних можна робити певні припущення, наприклад, де начінаюя текстові рядки Але у випадку з потоками двійкових даних такі припустити не є можливими Потоки довічних даних мають свої формати, які відомі лише програмам, призначеним для їх створення і читання

Типи потоків двійкових даних можна використовувати для обробки потоків Тетово даних, але для цього потрібне знання подробиць про потік даних Не забувайте, що надається NET система обробки тексту здатна раба з різними кодовими сторінками Unicode Кодова сторінка Unicode претавляет собою спеціальну таблицю перетворень Маніпулюючи самостійний текстовими потоками, використовуючи типи довічних потоків, ми говоримо NET, що будемо самі управляти подробицями кодових сторінок Unicode У действельності ж ми не хочемо цього робити і, значить, не повинні змішувати потоки даних Тому для нашого застосування нам буде потрібно створити два різних іерфейса: один для перетворення текстових даних в двійкові, а інший для перетворення двійкових даних в текст

ПРИМІТКА

Додаткову інформацію про Unicode та інших аспектах, повязаних з обробкою тексту,см в розд International Text Display (Виведення тексту національних мов) в MSDN за адресою http://msdn2microsoftcom/en-us/library/ms776l3laspx

Вихідний код інтерфейсу iBinary2TextProcessor для перетворення текстових даних в двійкові виглядає так:

using SystemIO namespace Binary2Text

{

public interface IBinary2TextProcessor {

void Process(Stream input, • TextWriter output)

}

}

Єдиний метод Process () інтерфейсу iBinary2TextProcessor має два паметра: потік двійкових даних і потік текстових даних Реалізація інтеейса iBinary2 Text Process or відповідатиме за зчитування даних двійкового потоку і збереження їх в текстовий потік

Інтерфейс iText2BinaryProcessor для перетворення текстового потоку в двчний організований подібним чином, за винятком того, що типи потоків звернені

using System10 namespace Text2Binary

{

public interface IText2BinaryProcessor {

void Process(TextReader input, Stream output)

}

}

Ідея, що лежить в основі обох інтерфейсів, полягає в тому, щоб концентроваться на пересилці даних з одного потоку в інший

Оболонка для обох інтерфейсів потоків дуже схожа на оболонку для потоку обробки тексту, за винятком того, що обробляються двійковий та тексти потоки Оболонка TextProcessor повинна була знати походження потоку: консоль або файл При роботі з двійковими потоками необхідність знати істоік даних продовжує існувати, але замість текстових потоків створюються двійкові Якщо ви розумієте механіку використання текстових потоків, то тає повинні розуміти механіку роботи з двійковими потоками

Далі наводиться повний код для реалізації класу для перетворення тексту даних в двійкові (Необхідно додати посилання на проект Text2Binary У проект е ReaderWriter)

using SystemIO using Text2Binary

namespace ReaderWriter {

public static class Text2BinaryBootstrap { public static void DisplayHelp() {

ConsoleWriteLine (Потрібна допомога Прямо зараз”)

}

public static void Process(string[] args,

IText2BinaryProcessor processor) { TextReader reader = null

Stream writer = null

if (argsLength == 0) { reader = ConsoleIn

writer = ConsoleOpenStandardOutput()

}

else if (argsLength == 1) { if (args[0] == &quot-help&quot) {

DisplayHelp() return

}

else {

reader = FileOpenText(args[0])

writer = ConsoleOpenStandardOutput()

}

}

else if (argsLength ==2 ) { if (args[0] == &quot-out&quot) { reader = ConsoleIn

writer = F±le0pen(args[l], FileModeCreate)

}

else {

DisplayHelp() return

}

}

else if (argsLength == 3) { if (args[0] == &quot-out&quot) {

reader = FileOpenText(args[2])

writer = FileOpen(args[1], FileModeCreate)

}

else {

DisplayHelp() return

}

}

else {

DisplayHelp() return

}

processorProcess(reader, writer) writerClose()

#if DEBUG_OUTPUT

ConsoleWriteLine)&quotArgument count(&quot + argsLength + &quot)&quot) foreach (string argument in args) {

ConsoleWriteLine(&quotArgument (&quot + argument + &quot)&quot)

}

#endif

}

}

}

Дана реалізація майже ідентична реалізації класу Bootstrap розбіжності виділені жирним шрифтом Зверніть увагу на те, що замість предопределеого члена даних consoleout викликається метод OpenStandardOutput (), А замість метод а FileCreateText () – мето д File Open ()

Реалізація оболонки перетворення двійкового потоку в текстовий майже ідеічна реалізації оболонки перетворення текстового потоку в двійковий Її йодним код можна знайти у вихідному коді для книги, який можна завантажити через Інтернет

Центральним завданням при перетворенні текстового потоку в двійковий і наобот є визначення типу Тип може бути класом (class) або структурою (struct) і визначається як тип, доступний для читання і запису Визначення типу доступним для читання і запису необхідно для того, щоб коли NET здійснює його читання або запис, залежна інфраструктура знала, що робити

Не забувайте, що потік двійкових даних є даними тільки тоді, коли програма знає, що він означає Щоб допомогти NET з читанням і записом цих типів, ми додаємо ідентифікатори, які вказують NET, що потрібно дати До счастиб, для цього не потрібно знати внутрішні подробиці процесу перетворення в двійкову форму, а тільки дати NET загальне уявлення про те, як керувати ним

Для прикладу передбачення лотерейних номерів ми визначимо тип, уявляю лотерейний квиток Квиток буде містити дату тиражу, звичайні номери і бусний номер Далі наводиться повний вихідний код оголошення даного типу: namespace LottoLibrary {

[Serializable]

public class Ticket { int[] _numbers

int _bonus

DateTime _drawDate

public Ticket() { &gt

public Ticket(DateTime drawDate, int[] numbers, int bonus) {

_drawDate = drawDate

_numbers = numbers

_bonus = bonus

}

public DateTime DrawDate { get {

return _drawDate

}

set {

_drawDate = value

}

}

public int[] Numbers { get {

return _numbers

}

set {

_numbers = value

}

}

public int Bonus { get {

return _bonus

}

set {

_bonus = value

}

}

}

}

Тип Ticket для представлення лотерейного квитка є звичайнісіньким клаом даних Але виділений жирним шрифтом код вимагає пояснень Першим випадком такого коду є укладений у квадратні дужки ідентифікатор serializabie, який представляє атрибут NET У NET є можливість описувати типи, методи і т д Атрибути – це описи, використовувані в опреденном контексті На відміну від ідентифікаторів public і abstract, які опивают основне поведінки типу, атрибут serializabie описує поведінку типу в конкретному контексті – коли обєкт потрібно перетворити з памяті в потік даних і навпаки Описи основного поведінки важливі для середовища виконання

. NET Атрибути NET такої важливості для середовища не представляють, але мають ваость для виконуваних середовищем бібліотек

При оголошенні типу атрибут serializabie описує можливість його серіалаціі Для перетворення обєкта Ticket в двійковий потік програмісту не потрібно нічого робити, окрім як передати обєкт потоку даних Подробицями перетворення будуть займатися бібліотеки потоку даних

В оголошенні Ticket не має параметрів конструктор виділений жирним шрифтом, щоб підкреслити, що такий тип конструктора необхідний при преоброваніі потоку даних в обєкт Коли двійкові потоки відновлюють типи, вони створюють примірник порожнього обєкта, після чого присвоюють значення членам даними Тому для створення обєкта потрібно конструктор без параметрів

Джерело: Гросс К С # 2008: Пер з англ – СПб: БХВ-Петербург, 2009 – 576 е: ил – (Самовчитель)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*