Как я могу реализовать класс, используя: интерфейс? - PullRequest
0 голосов
/ 02 января 2012

Как я могу реализовать метод из класса, который расширен до интерфейса?

У меня есть этот интерфейс:

public Interface myInterface
{
      public static int myMethod();
}

И этот класс:

public class MyClass : myInterface
{
       // And I want here to implement the method form myInterface and i don't know how
}

Ответы [ 3 ]

5 голосов
/ 02 января 2012

Interface не скомпилируется - измените его на interface. static не может быть частью interface.

После исправлений код будет выглядеть следующим образом:

public interface myInterface
{
      int myMethod();
}

public class MyClass : myInterface
{
       public int myMethod()
       {
           return 1;
       }
}

Относительно static и interface см. Цитату из http://channel9.msdn.com/forums/TechOff/250972-Static-Inheritance/?CommentID=274217:

Наследование в .NET работает только на базе экземпляров. Статические методы определяются на уровне типа, а не на уровне экземпляра. Поэтому переопределение не работает со статическими методами / свойствами / событиями ...

Статические методы хранятся в памяти только один раз. Для них не создано виртуальной таблицы и т. Д.

Если вы вызываете метод экземпляра в .NET, вы всегда указываете ему текущий экземпляр. Это скрыто во время выполнения .NET, но это происходит. Каждый метод экземпляра имеет в качестве первого аргумента указатель (ссылку) на объект, на котором запущен метод. Это не происходит со статическим методы (как они определены на уровне типа). Как должен компилятор решили выбрать метод для вызова?

0 голосов
/ 02 января 2012

Вы неправильно указали свой интерфейс. Интерфейс в C # указан с ключевым словом interface, в этом точном регистре. Также интерфейсы не могут содержать статические методы. Подробнее см. Интерфейсы (Руководство по программированию в C #) Статья MSDN.

0 голосов
/ 02 января 2012

Второе редактирование : позор мне. Я дал этот ответ до того, как проверил его, затем понял, что никогда ранее не объявлял статический метод в интерфейсе. Это не поддерживается, есть статья SO здесь , которая охватывает ее

не обращайте внимания на ответ ниже ...

Просто реализуйте метод как обычно:

public Interface myInterface
{
   static int myMethod();
}

//impl
public class MyClass : myInterface
{
   public static int myMethod()
   {
      //implementation here
   }
}

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

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