Проблема интерфейса C # - PullRequest
       1

Проблема интерфейса C #

1 голос
/ 03 ноября 2010

Почему-то у меня проблемы с интерфейсами.Я знаю, что было опубликовано 100 примеров, но, видимо, я недостаточно умен, чтобы понять это ...

У меня есть следующий интерфейс:

namespace DocStore.Interfaces
{
  public interface IResetCategoryControl
  {
    string CategoryToAdd { set; }
  }
}

Я хочу установить для CategoryToAdd значениезначение.

Вот мой класс, в котором я хочу установить его, и что у меня есть до сих пор:

  public partial class AddDocumentsDialog : IResetCategoryControl

    public string CategoryToAdd
    {
      set
      {
        IResetCategoryControl() ireset = new IResetCategoryControl();
        ireset.CategoryToAdd = value;       
      }
    }
  }

Что я делаю неправильно в классе AddDocumentDialog?Я не могу заставить эту часть работать.

Спасибо!

Эрок

Ответы [ 8 ]

11 голосов
/ 03 ноября 2010

Я не уверен, что вы пытаетесь сделать в своем установщике ... но следующая строка вызывает у вас проблемы:

IResetCategoryControl() ireset = new IResetCategoryControl();

Прежде всего, вы не используете круглые скобки при объявлении типа переменной. Во-вторых, вы не можете напрямую создать экземпляр интерфейса. Чтобы сделать это утверждение действительным, оно должно быть примерно таким:

IResetCategoryControl iReset = new SomeConcreteResetCategoryControl();

Существует более серьезная проблема:

Теоретически, ваш класс реализует интерфейс, и интерфейс указывает, что вам нужно свойство с именем CategoryToAdd с открытым сеттером. Это свойство должно устанавливать значение в вашем классе ... не новый экземпляр другого класса.

Я ожидаю, что код будет выглядеть примерно так:

public partial class AddDocumentsDialog : IResetCategoryControl
{
    private string categoryToAdd;

    public string CategoryToAdd
    {
        set
        {
            // do some logic to validate the value
            categoryToAdd = value;
        }
    }
}

Возможно, вы также захотите переосмыслить свой дизайн интерфейса, так как обычно свойства set only не приветствуются (в пользу использования метода, поскольку свойство set only указывает на некоторое количество выполняемой логики, а значение используется только внутри класс, а не доступ к потребителю снова).

10 голосов
/ 03 ноября 2010

Вы не можете создать экземпляр интерфейса; это просто контракт, а не сам объект. Вам необходимо выяснить, что означает контракт, и сделать так, чтобы AddDocumentsDialog реализовал этот контракт, делая то, что он должен делать, когда установлен CategoryToAdd.

На примечании сторон, свойства только для набора не приветствуются. Лучше использовать метод.

6 голосов
/ 03 ноября 2010

Следующая строка является проблемной:

IResetCategoryControl() ireset = new IResetCategoryControl();

Во-первых, вам нужно избавиться от первой круглой скобки:

IResetCategoryControl ireset = new IResetCategoryControl();

Далее, вы не можете создать экземпляр интерфейса.Интерфейс - это только подпись, которую должен реализовать конкретный класс.

Если вы просматриваете код других людей, щелкните правой кнопкой мыши IResetCategoryControl и выберите «Найти все ссылки», чтобы найти, если этот интерфейс уже былреализован в некотором классе.

Например, вы можете найти:

class SomeResetCatControl : IResetCategoryControl 
{

}

С другой стороны, похоже, что вам нужно только установить внутреннее приватное поле в вашем методе установки.В таком случае вы должны сделать это следующим образом:

public partial class AddDocumentsDialog : IResetCategoryControl
{
   private string _categoryToAdd = "";
   public string CategoryToAdd
   {
     set
     {
        _categoryToAdd = value;
     }
   }
}

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

2 голосов
/ 03 ноября 2010

Нельзя создать экземпляр интерфейса:

IResetCategoryControl() ireset = new IResetCategoryControl();

После ключевого слова new необходимо использовать объект, реализующий этот интерфейс.

1 голос
/ 03 ноября 2010

Вы не можете создать экземпляр интерфейса. Новый IResetCategoryControl никогда не будет работать. AddDocumentsCatalog реализует IResetCAtegoryControl со строковым свойством CategoryToAdd. Независимо от того, что вы делаете, чтобы вернуть CategoryToAdd, зависит от вас.

1 голос
/ 03 ноября 2010

ireset определяется только локально, в пределах набора. Вы не сможете получить к нему доступ где-либо еще

1 голос
/ 03 ноября 2010

Это недопустимо C # - удалить первую пару ():

IResetCategoryControl() ireset = new IResetCategoryControl();

Редактировать: Это все еще не действует C #. Вы не можете создать экземпляр интерфейса, только классы.

0 голосов
/ 03 ноября 2010

Судя по всему, ireset выходит из области видимости, как только вы установите одно из его свойств.Я предполагаю, что, вероятно, это должна быть переменная-член ...

Я предполагаю, что объявление типа 'IResetCategoryControl ()' является опечаткой, но если нет, то это тоже проблема.

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