Главная страница
Навигация по странице:

  • Листинг 1.4. Реализация интерфейсов и наследование базового класса System;// Ȼɚɡɨɜɵɣ ɚɛɫɬɪɚɤɬɧɵɣ ɤɥɚɫɫ:abstract class Base{ Глава 132

  • Васильев А.Н. Основы программирования на C#. Васильев А. Н. Программирование


    Скачать 5.54 Mb.
    НазваниеВасильев А. Н. Программирование
    АнкорВасильев А.Н. Основы программирования на C
    Дата20.09.2022
    Размер5.54 Mb.
    Формат файлаpdf
    Имя файлаVasilev_Programmirovanie-na-C-dlya-nachinayushchih-Osobennosti-y.pdf
    ТипДокументы
    #686596
    страница3 из 40
    1   2   3   4   5   6   7   8   9   ...   40
    {
    //
    Ɍɟɥɨ Начинается описание интерфейса с ключевого слова interface, после которого указывается название интерфейса, а в блоке из фигурных скобок объявляются методы, индексаторы и свойства НАЗ А МЕТКУ Помимо методов, индексаторов и свойств, интерфейс также может содержать объявление событий. Мы рассмотрим события в следующей главе.
    Для методов указывается только сигнатура тип результата, название метода и список аргументов. Ключевое слово abstract не указывается, как и ключевое слово virtual. По умолчанию объявленные винтер- фейсе методы (а также свойства и индексаторы) считаются абстрактными и виртуальными. Спецификатор уровня доступа также не указывается. Все методы (свойства, индексаторы), объявленные в интерфейсе, являются открытыми (то есть будто бы описанными с ключевым словом public
    , хотя оно явно не используется ПОДРОБНОСТИ bСвойства и индексаторы в интерфейсе объявляются с пустым телом, в котором указываются ключевые слова get и set
    . Наличие обоих ключевых слов (после каждого ставится точка с запятой) означает, что при описании у свойства и индексатора должно быть два аксес- сора. Можно указывать только одно ключевое слово, соответствующее аксессору, который должен быть у свойства или индексатора.
    Интерфейс нужен для того, чтобы на его основе создавать классы. Если класс создается на основе интерфейса, то говорят, что класс реализует
    Глава интерфейс. Реализация интерфейса в классе подразумевает, что в этом классе описаны все методы, свойства и индексаторы, которые объявлены в интерфейсе. Причем при описании методов, свойств и индексато- ров в классе ключевое слово override не используется ПОДРОБНОСТИ bПри наследовании абстрактного класса мы можем объявить производный класс как абстрактный и не описывать в нем некоторые или все абстрактные методы из абстрактного класса. При реализации интерфейса класс, реализующий интерфейс, должен содержать описание всех методов (свойств, индексаторов) из интерфейса. Описать только часть методов и на этом основании объявить класс абстрактным не получится.
    Имя интерфейса, реализуемого в классе, указывается в описании класса через двоеточие после имени класса (то есть также, как указывается имя базового класса при наследовании. Шаблон описания класса, реализующего интерфейс, следующий
    ɢɦɹ:ɢɧɬɟɪɮɟɣɫ{
    //
    Ɍɟɥɨ Реализация интерфейса напоминает наследование абстрактного класса. Но базовый класс может быть только один, а вот что касается реализации интерфейсов, тов одном классе может реализоваться больше одного интерфейса. Если класс реализует несколько интерфейсов, то эти интерфейсы перечисляются через запятую (после двоеточия) в описании класса
    ɢɦɹ:ɢɧɬɟɪɮɟɣɫ,ɢɧɬɟɪɮɟɣɫ,...,ɢɧɬɟɪɮɟɣɫ{
    //
    Ɍɟɥɨ Наследование базового класса (абстрактного или обычного) и реализация интерфейсов могут использоваться одновременно. В этом случаев описании класса после имени класса и двоеточия сначала указывается имя базового класса, а затем через запятую перечисляются реализуемые в классе интерфейсы
    ɢɦɹ:ɛɚɡɨɜɵɣ_ɤɥɚɫɫ,ɢɧɬɟɪɮɟɣɫ,ɢɧɬɟɪɮɟɣɫ,...,ɢɧɬɟɪɮɟɣɫ{
    Абстрактные классы и интерфейсы //
    Ɍɟɥɨ Если тактов классе должны быть описаны все методы, свойства и индекса- торы, объявленные в реализуемых интерфейсах, а если наследуемый базовый класс абстрактный — то и все абстрактные методы из базового класса.
    Для начала мы рассмотрим небольшой пример, в котором описывается интерфейса затем этот интерфейс реализуется в классе. Обратимся к программе в листинге 1.3.
    
    Листинг 1.3. Знакомство с интерфейсами System;
    //
    ɂɧɬɟɪɮɟɣɫ:
    interface MyInterface{
    //
    Ɉɛɴɹɜɥɟɧɢɟ ɦɟɬɨɞɨɜ:
    void show();
    void setNum(int n);
    int getNum();
    //
    Ɉɛɴɹɜɥɟɧɢɟ ɫɜɨɣɫɬɜɚ:
    int number{
    get;
    set;
    }
    //
    Ɉɛɴɹɜɥɟɧɢɟ ɢɧɞɟɤɫɚɬɨɪɚ:
    int this[int k]{
    get;
    }
    }
    //
    Ʉɥɚɫɫ ɪɟɚɥɢɡɭɟɬ ɢɧɬɟɪɮɟɣɫ:
    class MyClass:MyInterface{
    //
    Ɂɚɤɪɵɬɨɟ ɰɟɥɨɱɢɫɥɟɧɧɨɟ ɩɨɥɟ:
    private int num;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ ɫ ɨɞɧɢɦ ɚɪɝɭɦɟɧɬɨɦ:
    Глава 1
    28
    public MyClass(int n){
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɭ:
    number=n;
    //
    ȼɵɡɵɜɚɟɬɫɹ ɦɟɬɨɞ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    show();
    }
    //
    Ɉɩɢɫɚɧɢɟ ɦɟɬɨɞɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    public void show(){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɚ:
    Console.WriteLine(
    Ǝɋɜɨɣɫɬɜɨ number=Ǝ+number);
    }
    //
    Ɉɩɢɫɚɧɢɟ ɦɟɬɨɞɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    public void setNum(int n){
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɩɨɥɸ:
    num=n;
    }
    //
    Ɉɩɢɫɚɧɢɟ ɦɟɬɨɞɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    public int getNum(){
    //
    Ɂɧɚɱɟɧɢɟ ɩɨɥɹ:
    return num;
    }
    //
    Ɉɩɢɫɚɧɢɟ ɫɜɨɣɫɬɜɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    public int number{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    get{
    //
    ȼɵɡɵɜɚɟɬɫɹ ɦɟɬɨɞ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    return getNum();
    }
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    set{
    //
    ȼɵɡɵɜɚɟɬɫɹ ɦɟɬɨɞ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    setNum(value);
    Абстрактные классы и интерфейсы }
    }
    //
    Ɉɩɢɫɚɧɢɟ ɢɧɞɟɤɫɚɬɨɪɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ:
    public int this[int k]{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    get{
    //
    Ʌɨɤɚɥɶɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int r=number;
    //
    ƎɈɬɛɪɚɫɵɜɚɧɢɟƎ ɰɢɮɪ ɜ ɞɟɫɹɬɢɱɧɨɦ ɩɪɟɞɫɬɚɜɥɟɧɢɢ ɱɢɫɥɚ:
    for(int i=0;i r/=10;
    }
    //
    Ɋɟɡɭɥɶɬɚɬ:
    return r%10;
    }
    }
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class InterfaceDemo{
    //
    Ƚɥɚɜɧɵɣ ɦɟɬɨɞ:
    static void Main(){
    //
    ɐɟɥɨɱɢɫɥɟɧɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int m=9;
    //
    ɋɨɡɞɚɧɢɟ ɨɛɴɟɤɬɚ:
    MyClass obj=new MyClass(12345);
    //
    ɂɧɞɟɤɫɢɪɨɜɚɧɢɟ ɨɛɴɟɤɬɚ:
    for(int i=0;i<=m;i++){
    Console.Write(
    Ǝ|Ǝ+obj[m-i]);
    }
    Console.WriteLine(
    Ǝ|Ǝ);
    }
    }
    Глава Результат выполнения программы такой Результат выполнения программы (из листинга 1.3)
    ɋɜɨɣɫɬɜɨ В программе мы описали интерфейс с названием MyInterface. В этом интерфейсе объявлены три метода (метод show() без аргументов и не возвращающий результат метод getNum() без аргументов с целочисленным результатом и метод setNum() с целочисленным аргументом и не возвращающий результат, целочисленное свойство number доступное для считывания и записи) и индексатор с целочисленным индексом (доступен для считывания ПОДРОБНОСТИ bТо, что мы объявили в интерфейсе индексатор только с get
    - аксессором, означает, что при реализации индексатора в классе для индексатора должен быть описан get
    -аксессор. Номы можем описать для индексатора и set
    -аксессор. А вот если бы мы определяли индексатор, унаследованный из базового абстрактного класса, то описывать нужно было бы только те аксессоры, которые заявлены для индексатора в абстрактном классе.
    Класс MyClass реализует интерфейс MyInterface. В классе есть закрытое целочисленное поле num. Метод setNum() описан так, что переданный методу аргумент присваивается значением полю num. Метод getNum()
    результатом возвращает значение num.
    {
    i
    НАЗ А МЕТКУ Методы, объявленные в интерфейсе, по умолчанию считаются открытыми. Поэтому в классе они описываются с ключевым словом public
    . Это же замечание относится к свойствами индексаторам.
    Целочисленное свойство number описано так, что при считывании значения свойства вызывается метод getNum(), который в свою очередь возвращает результатом значение поля num. При присваивании значения свойству number вызывается метод setNum(), аргументом которому передается присваиваемое свойству значение (определяется параметром. В результате это значение присваивается полю num.
    Абстрактные классы и интерфейсы
    31
    Метод show() описан таким образом, что при его вызове отображается значение свойства В конструкторе класса сначала командой number=n свойству number присваивается в качестве значения аргумент n конструктора. После этого вызывается метод show(). Таким образом, при создании объекта класса MyClass в консольном окне появляется сообщение с информацией о значении свойства number.
    Индексатор в классе описан таким образом, что при индексировании объекта целочисленным индексом результатом возвращается цифра в десятичном представлении числа. Число в данном случае — это значение свойства number
    , и оно же — значение поля num. Индекс определяет позицию (разряд, на которой находится возвращаемая цифра в числе. Для вычисления результата в теле get-аксессора целочисленной переменной r присваивается значение свойства number, после чего запускается оператор цикла, в котором на каждой итерации командой r/=10 в десятичном представлении числа, записанного в переменную r, отбрасывается последняя цифра. Количество итераций цикла определяется значением индекса k. В итоге цифра, которая нас интересует, окажется на последней позиции. Эту цифру мы вычисляем командой r%10 как остаток отделения на В главном методе программы командой MyClass obj=new
    MyClass(12345)
    создается объект obj класса MyClass. При этом через цепочки вызовов задействованы практически все методы и свойство number
    , которые описаны в классе MyClass. Пример индексирования объекта представлен в операторе цикла, с помощью которого отображается десятичное представление числа, являющегося значением поля num объекта obj. Количество отображаемых разрядов превышает разрядную длину числа, поэтому старшие разряды заполнены нулями.
    Еще один пример, который мы рассмотрим далее, показывает, как реализовать в классе несколько интерфейсов при условии наследования базового класса (абстрактного. Интересующий нас программный код представлен в листинге 1.4.
    
    Листинг 1.4. Реализация интерфейсов и наследование базового класса System;
    //
    Ȼɚɡɨɜɵɣ ɚɛɫɬɪɚɤɬɧɵɣ ɤɥɚɫɫ:
    abstract class Base{
    Глава 1
    32
    //
    Ɉɛɴɹɜɥɟɧɢɟ ɚɛɫɬɪɚɤɬɧɨɝɨ ɫɜɨɣɫɬɜɚ:
    public abstract int number{
    get;
    set;
    }
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ ɫ ɨɞɧɢɦ ɚɪɝɭɦɟɧɬɨɦ:
    public Base(int n){
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɭ:
    number=n;
    //
    ȼɵɡɵɜɚɟɬɫɹ ɨɛɵɱɧɵɣ (ɧɟ ɚɛɫɬɪɚɤɬɧɵɣ) ɦɟɬɨɞ:
    show();
    }
    //
    Ɉɩɢɫɚɧɢɟ ɨɛɵɱɧɨɝɨ (ɧɟ ɚɛɫɬɪɚɤɬɧɨɝɨ) ɦɟɬɨɞɚ:
    public void show(){
    //
    Ɉɬɨɛɪɚɠɟɧɢɟ ɡɧɚɱɟɧɢɹ ɫɜɨɣɫɬɜɚ:
    Console.WriteLine(
    Ǝɋɜɨɣɫɬɜɨ number=Ǝ+number);
    }
    }
    //
    ɉɟɪɜɵɣ ɢɧɬɟɪɮɟɣɫ:
    interface First{
    //
    Ɉɛɴɹɜɥɟɧɢɟ ɦɟɬɨɞɨɜ:
    void setNum(int n);
    int getNum();
    }
    //
    ȼɬɨɪɨɣ ɢɧɬɟɪɮɟɣɫ:
    interface Second{
    //
    Ɉɛɴɹɜɥɟɧɢɟ ɢɧɞɟɤɫɚɬɨɪɚ:
    int this[int k]{
    get;
    }
    }
    //
    Ʉɥɚɫɫ ɪɟɚɥɢɡɭɟɬ ɢɧɬɟɪɮɟɣɫ:
    Абстрактные классы и интерфейсы MyClass:Base,First,Second{
    //
    Ɂɚɤɪɵɬɨɟ ɰɟɥɨɱɢɫɥɟɧɧɨɟ ɩɨɥɟ:
    private int num;
    //
    Ʉɨɧɫɬɪɭɤɬɨɪ ɫ ɨɞɧɢɦ ɚɪɝɭɦɟɧɬɨɦ:
    public MyClass(int n):base(n){}
    //
    Ɉɩɢɫɚɧɢɟ ɦɟɬɨɞɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ First:
    public void setNum(int n){
    //
    ɉɪɢɫɜɚɢɜɚɧɢɟ ɡɧɚɱɟɧɢɹ ɩɨɥɸ:
    num=n;
    }
    //
    Ɉɩɢɫɚɧɢɟ ɦɟɬɨɞɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ First:
    public int getNum(){
    //
    Ɂɧɚɱɟɧɢɟ ɩɨɥɹ:
    return num;
    }
    //
    Ɉɩɢɫɚɧɢɟ ɫɜɨɣɫɬɜɚ ɢɡ ɤɥɚɫɫɚ Base:
    public override int number{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    get{
    //
    ȼɵɡɵɜɚɟɬɫɹ ɦɟɬɨɞ ɢɡ ɢɧɬɟɪɮɟɣɫɚ First:
    return getNum();
    }
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɩɪɢɫɜɚɢɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    set{
    //
    ȼɵɡɵɜɚɟɬɫɹ ɦɟɬɨɞ ɢɡ ɢɧɬɟɪɮɟɣɫɚ First:
    setNum(value);
    }
    }
    //
    Ɉɩɢɫɚɧɢɟ ɢɧɞɟɤɫɚɬɨɪɚ ɢɡ ɢɧɬɟɪɮɟɣɫɚ Second:
    public int this[int k]{
    //
    Ⱥɤɫɟɫɫɨɪ ɞɥɹ ɫɱɢɬɵɜɚɧɢɹ ɡɧɚɱɟɧɢɹ:
    get{
    Глава 1
    34
    //
    Ʌɨɤɚɥɶɧɚɹ ɩɟɪɟɦɟɧɧɚɹ:
    int r=number;
    //
    ƎɈɬɛɪɚɫɵɜɚɧɢɟƎ ɰɢɮɪ ɜ ɞɟɫɹɬɢɱɧɨɦ
    //
    ɩɪɟɞɫɬɚɜɥɟɧɢɢ ɱɢɫɥɚ:
    for(int i=0;i r/=10;
    }
    //
    Ɋɟɡɭɥɶɬɚɬ:
    return r%10;
    }
    }
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class MoreInterfaceDemo{
    static void Main(){
    int m=9;
    MyClass obj=new MyClass(12345);
    for(int i=0;i<=m;i++){
    Console.Write(
    Ǝ|Ǝ+obj[m-i]);
    }
    Console.WriteLine(
    Ǝ|Ǝ);
    Ниже показано, как выглядит результат выполнения программы Результат выполнения программы (из листинга 1.4)

    ɋɜɨɣɫɬɜɨ Результат выполнения программы такой же, как ив предыдущем случае. Это неудивительно, поскольку представленный выше пример является
    Абстрактные классы и интерфейсы
    35
    вариацией предыдущего. Мы просто немного иначе организовали программный код. Если раньше у нас был один интерфейс MyInterface, на основе которого создавался класс MyClass, то теперь имеется абстрактный класс Base, на основе которого путем наследования создается класс MyClass. При этом класс MyClass реализует интерфейсы
    First и В классе Base объявляется абстрактное свойство number, причем поскольку теперь свойство объявляется не в интерфейсе, а в абстрактном классе, то мы используем в объявлении ключевое слово abstract. Также мы явно указали спецификатор уровня доступа public для свойства. При описании свойства в классе MyClass использовано ключевое слово В классе Base описан конструктор с целочисленным аргументом. Этот аргумент присваивается значением свойству number. После присваивания вызывается метод show(). Последний также описан в классе Base, причем хотя метод обычный (не абстрактный, нов теле метода (как ив теле конструктора) выполняется обращение к абстрактному свойству В интерфейсе First объявлены методы setNum() и getNum(). Винтер- фейсе Second объявлен индексатор с целочисленным индексом. Индек- сатор должен возвращать целое число, и у него должен быть get-аксессор.
    Как отмечалось выше, класс MyClass наследует абстрактный класс Base и реализует интерфейсы First и Second. Поэтому в классе MyClass описываются свойство number из класса Base, методы getNum() и setNum() из интерфейса First, а также индексатор из интерфейса
    Second
    . Соответствующий код должен быть понятен читателю ПОДРОБНОСТИ bКак ив предыдущем примере, класс
    MyClass содержит закрытое целочисленное поле num
    . Конструктор класса
    MyClass описан таким образом, что переданный конструктору целочисленный аргумент далее передается конструктору базового класса. Никаких дополнительных действий не выполняется, поэтому тело конструктора представляет собой пустой блок.
    В главном методе содержатся те же команды, что ив предыдущем примере Глава Наследование интерфейсов Но позвольте узнать, как же я вас пропишу У вас же нет ни имени, ни фамилии Это вы несправедливо. Имя я себе совершенно спокойно могу избрать. Пропечатал в газете — и шабаш.
    из к/ф Собачье сердце»
    Один интерфейс может наследовать другой интерфейс или даже несколько интерфейсов. Технически наследование интерфейсов реализуется так в описании интерфейса, наследующего другие интерфейсы, после его имени через двоеточие указываются наследуемые интерфейсы. Общий шаблон наследования интерфейсов выглядит следующим образом
    ɢɦɹ:ɢɧɬɟɪɮɟɣɫ,ɢɧɬɟɪɮɟɣɫ,...,ɢɧɬɟɪɮɟɣɫ{
    //
    Ɍɟɥɨ Если интерфейс Alpha наследует интерфейс Bravo, то все, что объявлено в интерфейсе Bravo, автоматически включается в состав интерфейса. Поэтому если некоторый класс MyClass реализует интерфейс Alpha, который наследует интерфейс Bravo, то фактически в этом классе должно быть описано все, что явно объявлено вин- терфейсе Alpha, и все, что описано в интерфейсе Bravo (поскольку содержимое интерфейса Bravo по факту содержится ив интерфейсе
    Alpha
    ).
    {
    i
    НАЗ А МЕТКУ Нередко вместо термина наследование интерфейсов для обозначения ситуации, когда интерфейс создается на основе одного или более уже существующих интерфейсов, используют термин расширение интерфейсов».
    Программа, в которой используется наследование интерфейсов, представлена в листинге 1.5. Это еще одна вариация на тему предыдущих двух примеров (для сокращения объема программного кода некоторые комментарии удалены
    Абстрактные классы и интерфейсы Листинг 1.5. Наследование интерфейсов System;
    //
    ɉɟɪɜɵɣ ɢɧɬɟɪɮɟɣɫ:
    interface First{
    //
    ɋɜɨɣɫɬɜɨ:
    int number{
    get;
    set;
    }
    //
    ɂɧɞɟɤɫɚɬɨɪ:
    int this[int k]{
    get;
    }
    }
    //
    ȼɬɨɪɨɣ ɢɧɬɟɪɮɟɣɫ:
    interface Second{
    //
    Ɇɟɬɨɞɵ:
    void setNum(int n);
    int getNum();
    }
    //
    ɂɧɬɟɪɮɟɣɫ ɧɚɫɥɟɞɭɟɬ ɞɪɭɝɢɟ ɢɧɬɟɪɮɟɣɫɵ:
    interface MyInterface{
    //
    Ɇɟɬɨɞ:
    void show();
    }
    //
    Ʉɥɚɫɫ ɪɟɚɥɢɡɭɟɬ ɢɧɬɟɪɮɟɣɫ:
    class MyClass:MyInterface{
    private int num;
    public MyClass(int n){
    number=n;
    show();
    Глава 1
    38
    }
    public void show(){
    Console.WriteLine(
    Ǝɋɜɨɣɫɬɜɨ number=Ǝ+number);
    }
    public void setNum(int n){
    num=n;
    }
    public int getNum(){
    return num;
    }
    public int number{
    get{
    return getNum();
    }
    set{
    setNum(value);
    }
    }
    public int this[int k]{
    get{
    int r=number;
    for(int i=0;i r/=10;
    }
    return r%10;
    }
    }
    }
    //
    Ʉɥɚɫɫ ɫ ɝɥɚɜɧɵɦ ɦɟɬɨɞɨɦ:
    class InterfaceDemo{
    static void Main(){
    int m=9;
    Абстрактные классы и интерфейсы MyClass obj=new MyClass(12345);
    for(int i=0;i<=m;i++){
    Console.Write(
    Ǝ|Ǝ+obj[m-i]);
    }
    Console.WriteLine(
    Ǝ|Ǝ);
    Результат выполнения программы такой же, как ив предыдущих случаях Результат выполнения программы (из листинга 1.5)

    ɋɜɨɣɫɬɜɨ Описание класса MyClass не изменилось (как и команды в главном методе. Класс MyClass реализует интерфейс MyInterface. Но только теперь сам интерфейс MyInterface наследует интерфейсы First и Second. В интерфейсе First объявлено свойство number и индекса- тор. В интерфейсе Second объявлены методы setNum() и getNum(). Непосредственно в интерфейсе MyInterface объявлен метод show(). Но поскольку интерфейс MyInterface наследует интерфейсы First и Second, то содержимое этих интерфейсов незримо присутствует в интерфейсе MyInterface. Поэтому класс, реализующий интерфейс, должен содержать описание не только тех методов, свойств и индексаторов, которые объявлены непосредственно винтер- фейсе MyInterface, но и описание всего, что объявлено в интерфейсах, наследуемых в интерфейсе Интерфейсные переменные

    Так вами надо. Ведь знали ж, кто он такой.
    из к/ф Собачье сердце»
    Хотя интерфейс напоминает классно на основе интерфейса объект создать нельзя (хочется верить, что ненужно объяснять, почему этого нельзя сделать. Но существует такое понятие, как интерфейсная
    Глава переменная. Интерфейсная переменная — это переменная, типом которой указано название интерфейса. Особенность и сила интерфейсной переменной в том, что интерфейсная переменная может ссылаться на объект любого класса, реализующего данный интерфейс (указанный типом интерфейсной переменной. То есть если имеется класс, который реализует некоторый интерфейс, и мы создали объект такого класса, то ссылку на данный объект можно записать не только в объектную переменную, типом которой указан интерфейс. Правда здесь имеется важное ограничение через интерфейсную переменную можно получить доступ только к тем методам, свойствами индексаторам (через индексирование объекта, которые объявлены в интерфейсе НАЗ А МЕТКУ Напомним, что, кроме методов, свойств и индексаторов, винтер- фейсе могут объявляться события. С событиями мы познакомимся позже, но то, что мы обсуждаем для методов, свойств и индексато- ров как содержимого интерфейсов, справедливо и для событий.
    Специфика интерфейсных переменных несколько напоминает работу с объектными переменными базовых классов объектная переменная базового класса может ссылаться на объект производного класса, и через такую переменную можно получить доступ только к тем членам, которые объявлены в базовом классе.
    Рассмотрим пример, в котором используется указанная особенность интерфейсных переменных. Проанализируем программу, представленную в листинге 1.6.
    
    1   2   3   4   5   6   7   8   9   ...   40


    написать администратору сайта