Интерфейсные свойства и индексаторы

90

Интерфейсные свойства

Аналогично методам, свойства указываются в интерфейсе вообще без тела. Ниже приведена общая форма объявления интерфейсного свойства:

// Интерфейсное свойство
тип имя{
get;
set;
}

Очевидно, что в определении интерфейсных свойств, доступных только для чтения или только для записи, должен присутствовать единственный аксессор: get или set соответственно.

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

Давайте рассмотрим пример:

using System;

namespace ConsoleApplication1
{
    interface IUserInfo
    {
        string Name
        {
            get;
            set;
        }
    }

    class UI : IUserInfo
    {
        string myName;

        public string Name
        {
            set
            {
                myName = value;
            }

            get
            {
                return myName;
            }
        }
    }

    class Program
    {
        static void Main()
        {
            UI user1 = new UI();
            user1.Name = "Alexandr";
            
            Console.ReadLine();
        }
    }
}

В данном примере в классе UI реализуется свойство интерфейса IUserInfo.

Интерфейсные индексаторы

В интерфейсе можно также указывать индексаторы. Ниже приведена общая форма объявления интерфейсного индексатора:

// Интерфейсный индексатор
тип_элемента this[int индекс]{
get;
set;
}

Как и прежде, в объявлении интерфейсных индексаторов, доступных только для чтения или только для записи, должен присутствовать единственный аксессор: get или set соответственно. Давайте добавим в предыдущий пример реализацию индексатора:

using System;

namespace ConsoleApplication1
{
    interface IUserInfo
    {
        string Name
        {
            get;
            set;
        }

        string this[int index]
        {
            get;
            set;
        }        
    }

    class UI : IUserInfo
    {
        string myName;

        public string Name
        {
            set
            {
                myName = value;
            }

            get
            {
                return myName;
            }
        }

        public string this[int index]
        {
            set { myName = value; }
            get { return myName; }
        }
    }

    class Program
    {
        static void Main()
        {
            UI user1 = new UI();
            user1.Name = "Alexandr";
            user1[5] = "Dmitryi";
            user1[10] = "Alexey";
            
            Console.ReadLine();
        }
    }
}
Пройди тесты
Лучший чат для C# программистов