Понятие и виды интерфейсов. Лекция: Виды интерфейсов

Как любое техническое устройство, компьютер обменивается информацией с человеком посредством набора определенных правил, обязательных как для машины, так и для человека. Эти правила в компьютерной литературе называются интерфейсом. Интерфейс может быть понятным и непонятным, дружественным и нет. К нему подходят многие прилагательные. Но в одном он постоянен: он есть, и никуда от него не денешься.

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

Интерфейс - это, прежде всего, набор правил. Как любые правила, их можно обобщить, собрать в "кодекс", сгруппировать по общему признаку. Таким образом, мы пришли к понятию "вид интерфейса" как объединение по схожести способов взаимодействия человека и компьютеров. Можно предложить следующую схематическую классификацию различных интерфейсов общения человека и компьютера (рис.1.).

Пакетная технология. Исторически этот вид технологии появился первым. Она существовала уже на релейных машинах Зюса и Цюзе (Германия, 1937 год). Идея ее проста: на вход компьютера подается последовательность символов, в которых по определенным правилам указывается последовательность запущенных на выполнение программ. После выполнения очередной программы запускается следующая и т.д. Машина по определенным правилам находит для себя команды и данные. В качестве этой последовательности может выступать, например, перфолента, стопка перфокарт, последовательность нажатия клавиш электрической пишущей машинки (типа CONSUL). Машина также выдает свои сообщения на перфоратор, алфавитно-цифровое печатающее устройство (АЦПУ), ленту пишущей машинки.

Такая машина представляет собой "черный ящик" (точнее "белый шкаф"), в который постоянно подается информация и которая также постоянно "информирует" мир о своем состоянии. Человек здесь имеет малое влияние на работу машины - он может лишь приостановить работу машины, сменить программу и вновь запустить ЭВМ. Впоследствии, когда машины стали помощнее и могли обслуживать сразу нескольких пользователей, вечное ожидание пользователей типа: "Я послал данные машине. Жду, что она ответит. И ответит ли вообще?" - стало, мягко говоря, надоедать. К тому же вычислительные центры, вслед за газетами, стали вторым крупным "производителем" макулатуры. Поэтому с появлением алфавитно-цифровых дисплеев началась эра по-настоящему пользовательской технологии - командной строки.

Командный интерфейс.

Командный интерфейс называется так по тому, что в этом виде интерфейса человек подает "команды" компьютеру, а компьютер их выполняет и выдает результат человеку. Командный интерфейс реализован в виде пакетной технологии и технологии командной строки.


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

Команды набираются в командной строке. Командная строка представляет собой символ приглашения и мигающий прямоугольник – курсор. При нажатии клавиши на месте курсора появляются символы, а сам курсор смещается вправо. Команда заканчивается нажатием клавиши Enter (или Return.) После этого осуществляется переход в начало следующей строки. Именно с этой позиции компьютер выдает на монитор результаты своей работы. Затем процесс повторяется.

Технология командной строки уже работала на монохромных алфавитно-цифровых дисплеях. Поскольку вводить позволялось только буквы, цифры и знаки препинания, то технические характеристики дисплея были не существенны. В качестве монитора можно было использовать телевизионный приемник и даже трубку осциллографа.

Обе эти технологии реализуются в виде командного интерфейса - машине подаются на вход команды, а она как бы "отвечает" на них.

Преобладающим видом файлов при работе с командным интерфейсом стали текстовые файлы - их и только их можно было создать при помощи клавиатуры. На время наиболее широкого использования интерфейса командной строки приходится появление операционной системы UNIX и появление первых восьмиразрядных персональных компьютеров с многоплатформенной операционной системой CP/M.

WIMP - интерфейс (Window - окно, Image - образ, Menu - меню, Pointer - указатель). Характерной особенностью этого вида интерфейса является то, что диалог с пользователем ведется не с помощью команд, а с помощью графических образов - меню, окон, других элементов. Хотя и в этом интерфейсе подаются команды машине, но это делается "опосредственно", через графические образы. Идея графического интерфейса зародилась в середине 70-х годов, когда в исследовательском центре Xerox Palo Alto Research Center (PARC) была разработана концепция визуального интерфейса. Предпосылкой графического интерфейса явилось уменьшение времени реакции компьютера на команду, увеличение объема оперативной памяти, а также развитие технической базы компьютеров. Аппаратным основанием концепции, конечно же, явилось появление алфавитно-цифровых дисплеев на компьютерах, причем на этих дисплеях уже имелись такие эффекты, как "мерцание" символов, инверсия цвета (смена начертания белых символов на черном фоне обратным, то есть черных символов на белом фоне), подчеркивание символов. Эти эффекты распространились не на весь экран, а только на один или более символов. Следующим шагом явилось создание цветного дисплея, позволяющего выводить, вместе с этими эффектами, символы в 16 цветах на фоне с палитрой (то есть цветовым набором) из 8 цветов. После появления графических дисплеев, с возможностью вывода любых графических изображений в виде множества точек на экране различного цвета, фантазии в использовании экрана вообще не стало границ! Первая система с графическим интерфейсом 8010 Star Information System группы PARC, таким образом, появилась за четыре месяца до выхода в свет первого компьютера фирмы IBM в 1981 году. Первоначально визуальный интерфейс использовался только в программах. Постепенно он стал переходить и на операционные системы, используемых сначала на компьютерах Atari и Apple Macintosh, а затем и на IBM -- совместимых компьютерах.

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

Графический интерфейс пользователя за время своего развития прошел две стадии и реализован на двух уровнях технологий: простой графический интерфейс и "чистый" WIMP - интерфейс.

На первом этапе графический интерфейс очень походил на технологию командной строки. Отличия от технологии командной строки заключались в следующем:

Ú При отображении символов допускалось выделение части символов цветом, инверсным изображением, подчеркиванием и мерцанием. Благодаря этому повысилась выразительность изображения.

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

Ú Нажатие клавиши Enter не всегда приводит к выполнению команды и переходу к следующей строке. Реакция на нажатие любой клавиши во многом зависит от того, в какой части экрана находился курсор.

Ú Кроме клавиши Enter, на клавиатуре все чаще стали использоваться "серые" клавиши управления курсором (см. раздел, посвященный клавиатуре в выпуске 3 данной серии.)

Ú Уже в этой редакции графического интерфейса стали использоваться манипуляторы (типа мыши, трекбола и т.п. - см. рисунок A.4.) Они позволяли быстро выделять нужную часть экрана и перемещать курсор.

Подводя итоги, можно привести следующие отличительные особенности этого интерфейса:

Ú Выделение областей экрана.

Ú Переопределение клавиш клавиатуры в зависимости от контекста.

Ú Использование манипуляторов и серых клавиш клавиатуры для управления курсором.

Ú Широкое использование цветных мониторов.

Появление этого типа интерфейса совпадает с широким распространением операционной системы MS-DOS. Именно она внедрила этот интерфейс в массы, благодаря чему 80-е годы прошли под знаком совершенствования этого типа интерфейса, улучшения характеристик отображения символов и других параметров монитора.

Типичным примером использования этого вида интерфейса является файловая оболочка Nortron Commander и текстовый редактор Multi-Edit. А текстовые редакторы Лексикон, ChiWriter и текстовый процессор Microsoft Word for Dos являются примером, как этот интерфейс превзошел сам себя.

Вторым этапом в развитии графического интерфейса стал "чистый" интерфейс WIMP, Этот подвид интерфейса характеризуется следующими особенностями:

Ú Вся работа с программами, файлами и документами происходит в окнах - определенных очерченных рамкой частях экрана.

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

Ú Все действия с объектами осуществляются с помощью меню. Хотя меню появилось на первом этапе становления графического интерфейса, оно не имело в нем главенствующего значения, а служило лишь дополнением к командной строке. В чистом WIMP - интерфейсе меню становится основным элементом управления.

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

Следует отметить, что WIMP требует для своей реализации цветной растровый дисплей с высоким разрешением и манипулятор. Также программы, ориентированные на этот вид интерфейса, предъявляют повышенные требования к производительности компьютера, объему его памяти, пропускной способности шины и т.п. Однако этот вид интерфейса наиболее прост в усвоении и интуитивно понятен. Поэтому сейчас WIMP - интерфейс стал стандартом де-факто.

Ярким примером программ с графическим интерфейсом является операционная система Microsoft Windows.

SILK - интерфейс (Speech - речь, Image - образ, Language - язык, Knowlege - знание). Этот вид интерфейса наиболее приближен к обычной, человеческой форме общения. В рамках этого интерфейса идет обычный "разговор" человека и компьютера. При этом компьютер находит для себя команды, анализируя человеческую речь и находя в ней ключевые фразы. Результат выполнения команд он также преобразует в понятную человеку форму. Этот вид интерфейса наиболее требователен к аппаратным ресурсам компьютера, и поэтому его применяют в основном для военных целей.

С середины 90-х годов, после появления недорогих звуковых карт и широкого распространения технологий распознавания речи, появился так называемый "речевая технология" SILK - интерфейса. При этой технологии команды подаются голосом путем произнесения специальных зарезервированных слов - команд.

Слова должны выговариваться четко, в одном темпе. Между словами обязательна пауза. Из-за неразвитости алгоритма распознавания речи такие системы требует индивидуальной предварительной настройки на каждого конкретного пользователя.

"Речевая" технология является простейшей реализацией SILK - интерфейса.

Биометрическая технология ("Мимический интерфейс".)

Эта технология возникла в конце 90-х годов XX века и на момент написания книги еще разрабатывается. Для управления компьютером используется выражение лица человека, направление его взгляда, размер зрачка и другие признаки. Для идентификации пользователя используется рисунок радужной оболочки его глаз, отпечатки пальцев и другая уникальная информация. Изображения считываются с цифровой видеокамеры, а затем с помощью специальных программ распознавания образов из этого изображения выделяются команды. Эта технология, по-видимому, займет свое место в программных продуктах и приложениях, где важно точно идентифицировать пользователя компьютера.

Компьютер обменивается информацией с человеком посредством набора определенных правил, обязательных как для машины, так и для человека. Эти правила называются интерфейсом. Интерфейс может быть понятным и непонятным, дружественным или нет. Современными видами интерфейсов являются:

1.Командный интерфейс – пользователь дает команды компьютеру, который их выполняет и выдает результат пользователю. Командный интерфейс реализован в виде пакетной технологии и технологии командной строки.

2.WIMP -интерфейс (WIMP от: Window – окно; Image – образ; Menu – меню; Pointer – указатель) – диалог пользователя с компьютером ведется при помощи графических образов: меню, окон и других элементов. Интерфейс реализован на двух уровнях технологий: простой графический интерфейс и WIMP-интерфейс.

3.SILK-интерфейс (SILK от: Speech – речь; Image – образ; Language – язык; Knowlege – знание) – разговор пользователя с компьютером. Интерфейс наиболее приближен к обычной, человеческой форме общения. При этом компьютер определяет команды, анализируя человеческую речь и находя в ней ключевые фразы. Результат выполнения команд компьютер преобразует в понятную человеку форму. Этот вид интерфейса наиболее требователен к аппаратным ресурсам компьютера, поэтому его применяют в основном для военных целей.

Основными технологиями реализации интерфейсов являются следующие технологии (рис.1.3.):

1.Пакетная технология . Исторически технология появилась первой и существовала уже на релейных машинах Зюса и Цюзе (Германия, 1937 год). На вход компьютера подавалась последовательность символов, в которых по определенным правилам указывалась последовательность запущенных на выполнение программ. После выполнения очередной программы запускалась следующая программа и т.д. Машина по определенным правилам находила команды и данные. Например, в качестве такой последовательности выступали: перфолента, стопка перфокарт, последовательность нажатия клавиш электрической пишущей машинки (типа CONSUL ). Машина выдавала свои сообщения на перфоратор, алфавитно-цифровое печатающее устройство (АЦПУ ), ленту пишущей машинки. Такая машина представляла собой шкаф, в который постоянно подавалась информация, и который постоянно информировал о своем состоянии. Пользователь имел малое влияние на работу машины. Он мог лишь приостановить работу машины, сменить программу и вновь запустить ЭВМ.


2.Технология командной строки . Информация пользователя для компьютера передается посредством клавиатуры. Компьютер выводит информацию на алфавитно-цифровой дисплей (монитор). Комбинацию «монитор + клавиатура» назвали терминалом или консолью . Команды набираются в командной строке , которая представляет собой символ приглашения и мигающий прямоугольник – курсор . При нажатии клавиши на месте курсора появляются символы и курсор смещается вправо, неправильно набранный символ стирается нажатием клавиши Delete (del ). Команда заканчивается нажатием клавиши Enter (Return .), после чего осуществляется переход в начало следующей строки, в позиции которой компьютер выдает на монитор результаты своей работы. Затем процесс повторяется. Технология командной строки уже работала на монохромных алфавитно-цифровых дисплеях.

Поскольку вводить позволялось только буквы, цифры и знаки препинания, то технические характеристики дисплея были не существенны. В качестве монитора можно было использовать телевизионный приемник или трубку осциллографа. Преобладающим видом файлов при работе с командным интерфейсом были текстовые файлы, которые можно было создавать при помощи клавиатуры. На время наиболее широкого использования интерфейса командной строки приходится появление операционной системы UNIX и появление первых восьмиразрядных персональных компьютеров с многоплатформенной операционной системой CP/M .

3.Технология графического интерфейса . Идея графического интерфейса возникла в середине 70-х годов, когда в исследовательском центре Xerox Palo Alto Research Center (PARC ) была разработана концепция визуального интерфейса. Предпосылкой графического интерфейса явилось уменьшение времени реакции компьютера на команду, увеличение объема оперативной памяти, развитие технической базы компьютеров. Аппаратным основанием концепции явилось появление алфавитно-цифровых дисплеев, которые стали поддерживать новые эффекты: мерцание символов, инверсию цвета (смена начертания белых символов на черном фоне черными символами на белом фоне), подчеркивание символов. Эффекты распространились не на весь экран, а только на один или более символов. Следующим шагом явилось создание цветного дисплея, позволяющего выводить, вместе с этими эффектами, символы в 16 цветах на фоне с палитрой (то есть цветовым набором) из 8 цветов.

Первая система с графическим интерфейсом 8010 Star Information System группы PARC появилась в начале 1981 года. Первоначально интерфейс использовался только в программах. Постепенно он стал переходить и на операционные системы, используемые сначала на компьютерах Atari и Apple Macintosh , затем и на IBM -совместимых компьютерах. Под влиянием новых концепций проходил процесс по унификации в использовании клавиатуры и мыши прикладными программами. Графический интерфейс пользователя за время своего развития прошел две стадии с 1974 года по настоящее время.

Простой графический интерфейс . На первом этапе графический интерфейс очень походил на технологию командной строки, за исключением следующих отличий:

При отображении символов допускалось выделение части символов цветом, инверсным изображением, подчеркиванием и мерцанием, благодаря чему повысилась выразительность изображения;

В зависимости от конкретной реализации графического интерфейса курсор мог представляться мерцающим прямоугольником или некоторой областью, охватывающей несколько символов, которая отличалась от других невыделенных частей;

Нажатие клавиши Enter не всегда приводило к выполнению команды и переходу к следующей строке, так как реакция на нажатие любой клавиши во многом зависела от того, в какой части экрана находился курсор;

Кроме клавиши Enter на клавиатуре стали использовать клавиши управления курсором и манипуляторы (мышь, трекбол и др., рис.1.4.), которые позволяли быстро выделять нужную часть экрана и перемещать курсор.

Отличительные особенности интерфейса: выделение областей экрана; переопределение клавиш клавиатуры в зависимости от контекста; использование манипуляторов и клавиш управления курсором; широкое использование цветных мониторов. Появление интерфейса совпадает с широким распространением операционной системы MS-DOS , которая внедрила этот интерфейс и улучшила характеристики отображения символов и другие параметры монитора. Примеры использования интерфейса: файловая оболочка Nortron Commander , текстовый редактор Multi-Edit , редакторы: Лексикон и ChiWriter , текстовый процессор Microsoft Word for Dos .


WIMP-интерфейс стал вторым этапом в развитии графического интерфейса, его характерные особенности:

Работа с программами, файлами и документами происходит в окнах - частях экрана, определенных очерченных рамкой;

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

Действия с объектами осуществляются с помощью меню, которое стало основным элементом управления;

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

Для реализации WIMP -интерфейсу требуются: цветной растровый дисплей с высоким разрешением, манипулятор и программы, ориентированные на данный вид интерфейса, которые предъявляют повышенные требования к производительности компьютера, объему его памяти, пропускной способности шины и т.п. В настоящее время WIMP -интерфейс является стандартом.

4.Речевая технология . Появилась в середине 90-х годов после появления недорогих звуковых карт. По этой технологии команды подаются голосом путем произнесения специальных зарезервированных слов – команд. Основными командами являются:

«Отдыхай» – выключение речевого интерфейса;

«Открыть» – переход в режим вызова той или иной программы, имя программы называется в следующем слове;

«Буду диктовать» – переход из режима команд в режим набора текста голосом;

«Режим команд» – возврат в режим подачи команд голосом и др.

Слова должны выговариваться четко, в одном темпе. Между словами обязательна пауза. Из-за неразвитости алгоритма распознавания речи такие системы требует индивидуальной предварительной настройки на каждого конкретного пользователя. Речевая технология является простейшей реализацией SILK - интерфейса.

5.Биометрическая технология (мимический интерфейс.). Технология возникла в конце 90-х годов XX века. Для управления компьютером используется выражение лица человека, направление его взгляда, размер зрачка и другие признаки. Для идентификации пользователя используется рисунок радужной оболочки его глаз, отпечатки пальцев и другая уникальная информация. Изображения считываются с цифровой видеокамеры, а затем с помощью специальных программ распознавания образов из этого изображения выделяются команды. Эта технология используется в программных продуктах и приложениях для идентификации пользователя компьютера.

6.Технология семантического интерфейса (общественного интерфейса). Технология возникла в конце 70-х годов XX века с развитием искусственного интеллекта и основана на семантических сетях. Данный вид интерфейса включает в себя: интерфейс командной строки, графический интерфейс, речевой интерфейс и мимический интерфейс. Основная его отличительная черта – отсутствие команд при общении с компьютером. Запрос формируется на естественном языке в виде связанного текста и образов. По своей сути интерфейс является моделированием общения человека с компьютером.

  • ООП
  • В прошедний понедельник мне посчастливилось попасть на собеседование на Senior .Net Developer в одну международную компанию. Во время собеседования мне предложили пройти тест, где ряд вопросов был связан с.Net. В частности в одном из вопросов надо было дать оценку (истина/ложь) ряду утверждений, среди которых было и такое:

    В.Net любой массив элементов, например int, по умолчанию реализует IList, что позволяет использовать его в качестве коллекции в операторе foreach.

    Быстро ответив на этот вопрос отрицательно и отдельно дописав на полях. что для foreach необходима реализация не IList, а IEnumerable, я перешел к следующему вопросу. Однако по дороге домой меня мучал вопрос: реализует ли массив все-таки этот интерфейс или нет?

    Про IList я смутно помнил, что этот интерфейс дает мне IEnumerable, индексатор и свойство Count, содержащее число элементов коллекции, а также еще пару редко используемых свойств, типа IsFixedCollection(). Массив имеет свойство Length для своего размера, а Count в IEnumerable является методом расширения от LINQ, что было бы невозможно, если бы этот метод был реализован в классе. Таким образом, получалось, что массив не мог реализовывать интерфейс IList, однако какое-то смутное чувство не давало мне покоя. Поэтому вечером после интервью я решил провести небольшое исследование.

    Класс System.Array

    Поскольку Reflector.Net у меня не был установлен, я просто написал короткую программку на С# чтобы узнать, что за интерфейсы реализуются целочисленным массивом.

    Var v = new int { 1, 2, 3 }; var t = v.GetType(); var i = t.GetInterfaces(); foreach(var tp in i) Console.WriteLine(tp.Name);

    Вот полный список полученных интерфейсов из окна консоли:

    ICloneable IList ICollection IEnumerable IStructuralComparable IStructuralEquatable IList`1 ICollection`1 IEnumerable`1 IReadOnlyList`1 IReadOnlyCollection`1

    Таким образом, массив в.Net все-таки реализует интерфейс IList и его обобщённый вариант IList<> .

    Чтобы получить более полную информацию я построил диаграмму класса System.Array.

    Мне сразу бросилась в глаза моя ошибка: Count было свойством не IList, а ICollection, еще предыдущего интерфейса в цепочке наследования. Тем не менее, сам массив уже не имел такого свойства, как и многих других свойств интерфейса IList, хотя другие свойства этого интерфейса, IsFixedSize и IsReadOnly были реализованы. Как такое вообще возможно?

    Всё сразу встает на свои места, когда вспоминаешь о том, что в С# можно реализовывать интерфейсы не только
    неявно (implicit), но и явно (explicit). Я знал об этой возможности из учебников, где приводился пример такой имплементации в случае. когда базовый класс уже содержит метод с тем же именем, что и метод интерфейса. Я также видел такую возможность в ReSharper. Однако до настоящего времени мне напрямую не приходилось сталкиваться с необходимостью явной реализации интерфейсов в моих собственных проектах.

    Сравнение явной и неявной реализации интерфейсов

    Давайте сравним эти два вида реализации интерфейсов:.
    Критерии
    Неявная (implicit) реализация
    Явная (explicit) реализация
    Базовый синтаксис
    interface ITest { void DoTest(); } public class ImplicitTest: ITest { public void DoTest() { } }
    interface ITest { void DoTest(); } public class ExplicitTest: ITest { void ITest.DoTest() { } }
    Видимость
    Неявная имплементация всегда являелся открытой (public), поэтому к методам и свойствам можно обращаться напрямую.
    var imp = new ImplicitTest(); imp.DoTest();
    Явная имплементация всегда закрыта (private).
    Чтобы получить доступ к имплементации необходимо кастовать инстанцию класса к интерфейсу (upcast to interface).
    var exp = new ExplicitTest(); ((ITest)exp).DoTest();
    Полиморфия
    Неявная имплементация интерфейса может быть виртуальной (virtual), что позволяет переписывать эту имплементацию в классах-потомках.
    Явная имплементация всегда статична. Она не может быть переписана (override) или перекрыта (new) в классах-потомках. Прим. 1
    Абстрактный класс и реализация
    Неявная реализация может быть абстрактной и реализовываться только в классе-потомке.
    Явная реализация не может быть абстрактной, но сам класс может иметь другие абстрактные методы и сам быть абстрактным. Прим. 2

    Примечания:
    Прим. 1 - Как справедливо замечает в комментариях, реализация может быть переопределена при повторной явной имплементации интерфейса в классе-потомке (см. первый комментарий к статье).

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

    Зачем нужна явная реализация интерфейсов

    Явная реализация интерфейса, согласно MSDN , необходима в том случае, когда несколько интерфейсов, реализуемых классом, имеют метод с одинаковой сигнатурой. Эта проблема в общем виде известна в англоязычном мире под леденящим кровь названием «deadly diamond of death» , что переводится на русский как «проблема ромба» . Вот пример такой ситуации:

    /* Listing 1 */ interface IJogger { void Run(); } interface ISkier { void Run(); } public class Athlete: ISkier, IJogger { public void Run() { Console.WriteLine("Am I an Athlete, Skier or Jogger?"); } }

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

    /* Listing 2 */ var sp = new Athlete(); sp.Run(); (sp as ISkier).Run(); (sp as IJogger).Run();

    Результатом исполнения этого кода будет «Am I an Athlete, Skier or Jogger?» , выведенное в консоли три раза.

    Именно здесь мы можем использовать явную реализацию интерфейса для того, чтобы разделить все три случая:

    /* Listing 3 */ public class Sportsman { public virtual void Run() { Console.WriteLine("I am a Sportsman"); } } public class Athlete: Sportsman, ISkier, IJogger { public override void Run() { Console.WriteLine("I am an Athlete"); } void ISkier.Run() { Console.WriteLine("I am a Skier"); } void IJogger.Run() { Console.WriteLine("I am a Jogger"); } }

    В данном случае при исполнении кода из Listing 2 мы увидим в консоли три строчки, «I am an Athlete» , «I am a Skier» и «I am a Jogger» .

    Плюсы и минусы различной реализации интерфейсов

    Видимость реализации и выборочная реализация
    Как уже было показано выше, неявная (implicit) реализация синтаксически не отличается от обычного метода класса (причём если этот метод уже был определен в классе-предке, то в таком синтаксисе метод будет сокрыт (hidden) в потомке и код будет без проблем скомпилирован c compiler warning о сокрытии метода.). Более того, возможна выборочная реализация отдельных методов одного интерфейса как явным, так и неявным образом:

    /* Listing 4 */ public class Code { public void Run() { Console.WriteLine("I am a class method"); } } interface ICommand { void Run(); void Execute(); } public class CodeCommand: Code, ICommand { // implicit interface method implementation // => public implementation // implicit base class method hiding (warning here) public void Run() { base.Run(); } // explicit interface method implementation // => private implementation void ICommand.Execute() {} }

    Это позволяет использовать реализации отдельных методов интерфейса как родных методов класса и они доступны, например, через IntelliSense, в отличие от явной реализации методов, которые являются приватными и видны только после каста к соответствующему интерфейсу.

    С другой стороны, возможность приватной реализации методов позволяет скрывать ряд методов интерфейса, при этом полностью его имплементируя. Возвращаясь к нашему самому первому примеру с массивами в.Net, можно увидеть, что массив скрывает, например, имплементацию свойства Count интерфейса ICollection, выставляя наружу это свойство под именем Length (вероятно это является попыткой поддержания совместимости с С++ STL и Java). Таким образом, мы можем скрывать отдельные методы реализованного интерфейса и не скрывать (=делать публичными) другие.

    Здесь, правда, возникает такая проблема, что во многих случаях совершенно невозможно догадаться о том, какие интерфейсы реализованы классом «неявно», поскольку ни методы, ни свойства этих интерфейсов не видны в IntelliSense (здесь также показателен пример с System.Array). Единственным способом выявления таких реализаций является использование рефлексии, например при помощи Object Browser в Visual Studio.

    Рефакторинг интерфейсов
    Так как неявная (публичная) имплементация интерфейса не отличается от реализации публичного метода класса, в случае рефакторинга интерфейса и удаления из него какого-либо публичного метода (например при объединении методов Run() и Execute() из вышепредставленного интерфейса ICommand в один метод Run()) во всех неявных реализациях останется метод с открытым доступом, который, очень вероятно, придётся поддерживать даже после рефакторинга, так как у данного публичного метода могут быть уже различные зависимости в других компонентах системы. В результате этого будет нарушаться принцип программирования «против интерфейсов, а не реализаций», так как зависимости будут уже между конкретными (и в разных классах, наверняка, разными) реализациями бывшего интерфейсного метода.

    /* Listing 5 */ interface IFingers { void Thumb(); void IndexFinger(); // an obsolete interface method // void MiddleFinger(); } public class HumanPalm: IFingers { public void Thumb() {} public void IndexFinger() {} // here is a "dangling" public method public void MiddleFinger() {} } public class AntropoidHand: IFingers { void IFingers.Thumb() {} void IFingers.IndexFinger() {} // here the compiler error void IFingers.MiddleFinger() {} }

    В случае приватной реализации интерфейсов все классы с явной реализацией несуществующего более метода просто перестанут компилироваться, однако после удаления ставшей ненужной реализации (или ее рефакторинга в новый метод) у нас не будет «лишнего» публичного метода, не привязанного к какому-либо интерфейсу. Конечно, возможно потребуется рефакторинг зависимостей от самого интерфейса, но здесь, по крайней мере, не будет нарушения принципа «program to interfaces, not implementations».

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

    /* Listing 6 */ interface IProperty { int Amount { get; set; } } public class ClassWithProperty: IProperty { // implicit implementation, public public int Amount { get; set; } public ClassWithProperty() { // internal invocation of the public setter Amount = 1000; } } public class ClassWithExplicitProperty: IProperty { // explicit implementation, private int IProperty.Amount { get; set; } public ClassWithExplicitProperty() { // internal invocation isn"t possible // compiler error here Amount = 1000; } }

    При явной имплементации свойств интерфейса эти свойства остаются приватными и для доступа приходится идти «длинным» путём и объявлять дополнительную закрытое поле, через которое и происходит инициализация. В результате это приводит к более чистому коду, когда методы доступа к свойству используются только для доступа извне.

    Использования явной типизации локальных переменных и полей классов
    В случае явной реализации интерфейсов нам приходится явным образом указывать, что мы работаем не экземпляром класса, а с экземпляром интерфейса. Таким образом, например, становится невозможным использование type inference и декларация локальных переменных в С# при помощи служебного слова var. Вместо этого нам приходится использовать явную декларацию с указанием типа интерфейса при объявлении локальных переменных, а также в сигнатуре методов и в полях класса.

    Таким образом, мы с одной стороны как бы делаем код несколько менее гибким (например ReSharper по умолчанию всегда предлагает использовать декларацию с var если это возможно), но зато избегаем потенциальных проблем, связанных с привязкой к конкретной имплементации, по мере роста системы и объема её кода. Этот пункт может показаться многим спорным, но в случае, когда над проектом работает несколько человек, да еще в разных концах света, использования явной типизации может быть очень даже полезным, так как это повышает читабельность кода и уменьшает затраты на его поддержку.

    Командный интерфейс

    Наиболее старым интерфейсом является командный интерфейс (интерфейс командной строки ), который был наиболее распространен в период расцвета больших многопользовательских систем с алфавитно-цифровыми дисплеями. Для командного интерфейса характерно взаимодействие пользователя с ЭВМ с помощью командной строки, в которую вводятся команды определенного формата, а затем передаются к исполнению.

    Командный интерфейс реализован в виде пакетной технологии и технологии командной строки.

    Для ввода информации пользователь использует клавиатуру или другое символьное устройство ввода. Пользователь получает информацию в виде текста посредством дисплея или печатающего устройства (довольно редко).

    Рисунок 1. Пример командного интерфейса

    Работа с командным интерфейсом заключалась в следующем:

    • пользователь вводил команду с помощью последовательности символов (командной строки);
    • компьютер сопоставлял поступившую команду с имеющимся в его памяти набором команд;
    • выполнялось действие, которое соответствовало поступившей команде.

    Замечание 1

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

    К преимуществам интерфейса командной строки относят:

    • низкие требования к аппаратным средствам – минимальным набором для работы является клавиатура и символьное устройство вывода или терминал;
    • высокая степень унификации – взаимодействие обеспечивается через ввод и вывод символов, который часто реализуется через файловый ввод-вывод;
    • широкая возможность интеграции программ – посредством использования командного интерпретатора и перенаправления ввода-вывода.

    Недостатками командного интерфейса считают:

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

    Наиболее часто командный интерфейс используется при работе с командным интерпретатором, который используется как интерфейс управления операционной системой (Linux, xBSD, QNX, MS-DOS и др.).

    Графический интерфейс пользователя

    Графический интерфейс , WIMP-интерфейс (Window Image Menu Pointer) является неотъемлемым компонентом большинства современного программного обеспечения, которые ориентированы на работу конечного пользователя. Диалог пользователя с ПК в графическом интерфейсе ведется при помощи графических объектов: меню, значков и других элементов.

    Основные достоинства графического интерфейса:

    • наглядность объектов;
    • обеспечение понятности для пользователя;
    • схожесть интерфейсов программ, которые написаны специально для использования в графической среде.

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

    Рисунок 2. Пример графического интерфейса

    Речевой интерфейс

    Речевой интерфейс , SILK-интерфейс (Speech Image Language Knowledge) на данный момент существует только как «голосовой» (не считая биометрические интерфейсы, которые применяются не для управления ПК, а только для идентификации пользователя). Использование речевого интерфейса является очень перспективным направлением, т.к. введение информации с помощью голоса – самый быстрый и удобный способ. Т.к. качество распознавания устной речи пока не идеально, практическая реализация речевого интерфейса еще не стали доминирующими.

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

    Рисунок 3.

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

    • указывает пользователю ошибки в работе и находит пути их решения;
    • сообщает о ситуациях, которые нуждаются в исправлении;
    • осуществляет поиск справок из информационно-поисковых систем.

    Замечание 2

    Современные операционные системы поддерживают командный, графический и речевой интерфейсы.

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