ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 11.12.2025
Просмотров: 3236
Скачиваний: 1
Часть V
З а б а з о в ы м и к л а с с а м и
В а ши объекты до сих пор были простыми вещами наподобие целых чисел или строк, в крайнем случае — счетов B a n k A c c o u n t . Но в С# имеются и другие объекты. Из этой части вы узнаете, как писать соб ственные объекгы типов-значений (работающие подобно типам i n t или f l o a t ) , и познакомитесь с интерфейсами, которые позволяют сделать ваши объекты более обобщенными и гибкими. Вместе с аб страктными классами, рассмотренными в главе 13, "Полиморфизм", интерфейсы предоставляют ключ к передовым методам проектиро вания программ. Так что читайте внимательно!
Однако интерфейсы — не единственный способ сделать обобщенный и гибкий код. Новые возможности С# позволяют создавать обобщен ные (generic) о б ъ е к т ы — например, контейнеры, в которых могут храниться различные данные других типов. Пока что это звучит для вас сплошной абстракцией, но к концу части абстракция наполнится конкретным содержанием, так что запаситесь терпением.
Глава 14
Интерфейсы и структуры
Отношение М О Ж Е Т _ И С П О Л Ь З О В А Т Ь С Я _ К А К
Определение интерфейса
Использование интерфейса для выполнения распространенных операций
Определение структуры
Использование структуры для объединения классов, интерфейсов и встроенных типов в одну иерархию классов
ласе может содержать ссылку на другой класс. Это — простое отношение СО ДЕРЖИТ. Один класс может расширять другой класс с п о м о щ ь ю наследования.
Ь—отношение Я В Л Я Е Т С Я . Интерфейсы С# реализуют еще одно, не менее важное яношение — М О Ж Е Т _ И С П О Л Ь З О В А Т Ь С Я _ К А К .
Если вы хотите написать памятку, вы можете взять ручку и обрывок бумаги, можете Епользоваться органайзером или сделать это посредством своего компьютера. Все эти ккты реализуют операцию "написать памятку" — T a k e A N o t e . Используя магию нашедования, на языке С# это можно реализовать следующим образом:
::stract class ThingsThatRecord
{
abstract p u b l i c v o i d T a k e A N o t e ( s t r i n g s N o t e ) ;
}
public class Pen : ThingsThatRecord
{
override public void TakeANote (string sNote)
{
II. . . Написание заметки ручкой . . .
}
}
public class PDA : ThingsThatRecord
override |
p u b l i c v o i d T a k e A N o t e ( s t r i n g s N o t e ) |
I I . . |
. п р и п о м о щ и о р г а н а й з е р а . . . " |
) |
|
interface IRecordable |
|
|
{ |
|
|
v o i d T a k e A N o t e ( s t r i n g |
s N o t e ) |
|
{ |
|
|
Обратите внимание на ключевое |
слово i n t e r f a c e там, где обычно стоит ключевое |
|
слово c l a s s . В фигурных скобках |
интерфейса приведен список абстрактных |
методов. |
Интерфейсы не содержат определения никаких членов-данных. |
|
|
Метод T a k e A N o t e () записан без реализации. Ключевые слова p u b l i c и |
v i r t u a l |
|
ни a b s t r a c t не являются необходимыми . Все методы интерфейса открыты, |
а сам он |
|
не включается ни в какое обычное наследование — это интерфейс, а не класс. |
|
|
Класс, который реализует интерфейс, должен предоставить реализацию для каждого злемента интерфейса. Метод, реализующий метод интерфейса, не использует ключевое слово o v e r r i d e — это не похоже на перекрытие виртуальной функции.
По соглашению имена интерфейсов начинаются с буквы I, Кроме того, для них, как правило, используются прилагательные (в то время как для имен клас сов — существительные). Как обычно, это только соглашение — С# совершен но все равно, как именно вы назовете ваш интерфейс.
Далее приведено объявление, указывающее, что класс PDA реализует интерфейс
IRecordable. |
|
public c l a s s |
PDA : I R e c o r d a b l e |
{ |
|
public v o i d |
T a k e A N o t e ( s t r i n g s N o t e ) |
{ |
|
II . . . |
Н а п и с а н и е п а м я т к и . . . |
Как видите, не существует отличий между синтаксисом объявления наследования базового класса T h i n g s T h a t R e c o r d и объявлением о реализации интерфейса I R e c o r d a b l e .
В этом и заключается основная причина соглашения об именовании интерфей сов — чтобы сразу отличать их от классов.
Вывод из всего сказанного — интерфейс описывает возможности и свойства. Кроме иго, он представляет собой контракт. Если вы согласны реализовать все методы, опре деленные в интерфейсе, вы получите все его возможности .
Класс реализует интерфейс, предоставляя определения всех методов интерфейса, как показано в приведенном далее фрагменте исходного текста,
public class Pen : IRecordable
{
public |
v o i d |
T a k e A N o t e ( s t r i n g |
s N o t e ) |
{ |
|
|
|
I I . |
. . |
З а п и с ь р у ч к о й . . . |
|
} |
|
|
|
Глава 14. Интерфейсы и структуры |
313 |
||