Вы можете использовать интерфейсы для создания постоянных и неконстантных версий интерфейса? - PullRequest
1 голос
/ 25 августа 2009

В настоящее время я читаю Effective C # и нашел следующую строку очень запутанной:

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

Что такое и неконстантные версии интерфейса? И где бы мы это использовали?

Код поддержки:

public interface IConstNameValuePair
{
  object Name
  {
    get;
  }

  object Value
  {
    get;
  }
}
public interface INameValuePair
{
  object Value
  {
    get;
    set;
  }
}

// Usage:
public class Stuff : IConstNameValuePair, INameValuePair
{
  private string _name;
  private object _value;

  #region IConstNameValuePair Members
  public object Name
  {
    get
    {
      return _name;
    }
  }

  object IConstNameValuePair.Value
  {
    get
    {
      return _value;
    }
  }

  #endregion

  #region INameValuePair Members

  public object Value
  {
    get
    {
      return _value;
    }
    set
    {
     _value = value;
    }
  }
  #endregion
}

Ответы [ 3 ]

3 голосов
/ 25 августа 2009

Это показывает, что через один из этих интерфейсов вы не можете изменить значение (свойство set не определено). Это немного сомнительно, чтобы назвать это «const», поскольку это на самом деле ключевое слово, которое имеет особое значение. Но это то, что автор имеет в виду.

1 голос
/ 25 августа 2009

Что такое и неконстантные версии интерфейса?

Я думаю, что он имеет в виду «const» и «неконстантный» так, как их понимает программист C ++, т.е.

Интерфейс 'const' - это интерфейс, свойства которого вы не можете изменить. Например, в следующем коде метод test1 может получить, но не может установить свойства экземпляра вещи.

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

void test()
{
  Stuff stuff = new Stuff();
  test1(stuff);
  test2(stuff);
}

void test1(IConstNameValuePair stuff)
{
}

void test2(INameValuePair stuff)
{
}
0 голосов
/ 25 августа 2009

Во-первых, вам нужно понять, что выбор используемых имен (const и nonconst) очень скуден. Const обычно ссылается на идею, что значение равно const ant, что означает, что его нельзя изменить.

Глядя на два интерфейса, IConstNameValuePair определяет только метод доступа к свойству get. Когда у вас есть экземпляр Stuff, который был приведен к IConstNameValuePair, тогда у вас фактически есть неизменяемый экземпляр, потому что через интерфейс невозможно изменить значения.

Интерфейс INameValuePair определяет методы доступа к свойствам get и set. Когда у вас есть экземпляр Stuff, который был приведен к INameValuePair, тогда у вас фактически есть изменяемый экземпляр, потому что через интерфейс вы можете изменять значения.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...