интерфейс как член класса
От: conceal_blaze  
Дата: 29.09.08 07:46
Оценка:
Добрый день. Нашел в коде такой кусок кода:
    public interface ITestInterface
    {
        void Func(int par);
    }

    internal class Calc
    {
        ITestInterface inter;
    }

Я думал, что интерфейсы сами в себе бесполезны, если только от них не наследуются, также думал что нельзя создать экземпляр интерфейса. Как может применяться такая конструкция?
Re: интерфейс как член класса
От: nikov США http://www.linkedin.com/in/nikov
Дата: 29.09.08 07:52
Оценка:
Здравствуйте, conceal_blaze, Вы писали:

_>Я думал, что интерфейсы сами в себе бесполезны, если только от них не наследуются, также думал что нельзя создать экземпляр интерфейса. Как может применяться такая конструкция?


В переменной или поле, типом которых является интерфейс, может находиться null или ссылка на экземпляр класса (или упакованную структуру), реализующего этот интерфейс. Экземпляры интерфейсов создавать нельзя.
Re[2]: интерфейс как член класса
От: conceal_blaze  
Дата: 29.09.08 08:09
Оценка:
Здравствуйте, nikov, Вы писали:

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


То есть это будет использоваться как-то так:

    public interface ITestInterface
    {
        void Func(int par);
    }

    internal class Calc
    {
        ITestInterface inter;
    }

  public class NewClass : ITestInterface
  {
    int i;

    void Func(int par)
    {
      i = par;
    }
  }

  class Programm
  {
    static void main(string[] args)
    {
      Calc objCalc = new Calc();
      NewClass objNewClass = new NewClass();

      objCalc.inter = objNewClass;
      objCalc.inter.Func(5);
    }
  }

?
Re[3]: интерфейс как член класса
От: nikov США http://www.linkedin.com/in/nikov
Дата: 29.09.08 08:22
Оценка:
Здравствуйте, conceal_blaze, Вы писали:

_>То есть это будет использоваться как-то так:

_>?

Да, типа того:


[c#]
public interface ITestInterface
{
    void Func(int par);
}

internal class Calc
{
    public ITestInterface inter;
}

public class NewClass : ITestInterface
{
    int i;

    public void Func(int par)
    {
        i = par;
    }
}

class Programm
{
    static void Main(string[] args)
    {
        Calc objCalc = new Calc();
        NewClass objNewClass = new NewClass();

        objCalc.inter = objNewClass;
        objCalc.inter.Func(5);
    }
}
[/c#]
Re[4]: интерфейс как член класса
От: conceal_blaze  
Дата: 29.09.08 08:33
Оценка:
Здравствуйте, nikov, Вы писали:

N>Да, типа того:


Спасибо. Правда если посмотреть на код, то видно что в конечном итоге изменяется объект типа NewClass. Можно было бы просто у экземпляра данного класса вызвать наследуемую от интерфейса функцию напрямую. Возможность есть, осталось придумать где применить )
Re[5]: интерфейс как член класса
От: nikov США http://www.linkedin.com/in/nikov
Дата: 29.09.08 08:54
Оценка:
Здравствуйте, conceal_blaze, Вы писали:

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


При разработке класса, использующего интерфейс, ты можешь не знать, экземпляр какого именно класса там будет в рантайм, и тем не менее ты будешь работать с ним типобезопасным образом. Более того, этот класс может быть еще не написан, и будет находится в другой сборке и будет создаваться совершенно другим разработчиком (который может не иметь доступа к твоему классу вообще, а доступ к интерфейсу иметь только в скомпилированном, бинарном виде). Это называется — отделение контракта (или интерфейса) от реализации.
Re[6]: интерфейс как член класса
От: conceal_blaze  
Дата: 29.09.08 08:59
Оценка:
Здравствуйте, nikov, Вы писали:

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


Спасибо, теперь разобрался.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.