Может ли CLR работать со статическими интерфейсами? - PullRequest
3 голосов
/ 23 июля 2010

И если так, то почему вы не можете сделать это:

public interface IParsable
{
    static IParsable Parse(string s);
    static bool TryParse(string s, out IParsable);
}

в C #?

РЕДАКТИРОВАТЬ: Или, альтернативно:

public interface IParseable<T>
{
    static T Parse(string s);
    static bool TryParse(string s, out T);
}

РЕДАКТИРОВАТЬ # 2: Я научился глупости своих способов, пытаясь использовать IParsable, как предлагают многие ниже. Пример, который я сделал, следующий. Конечно, нет способа разрешить вызов TryParse ...

public IParsable ReadFromKeyboard()
{
    IParsable ToReturn;
    bool FirstTry = false;
    bool Success;
    do
    {
        if (!FirstTry)
            DisplayError();
        AskForInput();

        Success = IParsable.TryParse(Console.ReadLine, out ToReturn);
        FirstTry = false;
    } while(!Success)

    return ToReturn;
}

Ответы [ 6 ]

5 голосов
/ 23 июля 2010

Нет, в CLR нет такой вещи, как статические интерфейсы. Я предположил, что они были бы полезны для ограничений общего типа, но это только использование * , которое я вижу для них ... иначе как бы вы использовали IParsable в вашем пример? Как бы вы передали тип, который смог его проанализировать?

См. в этом блоге для более подробной информации о том, что я планировал.

3 голосов
/ 23 июля 2010

CLR не поддерживает это.Это специально.

Это было предложено до . И если вы прочтете комментарии там, вы увидите, что в CLR уже есть некоторые контракты на уровне типов (такие как ограничения на дженерики).

Однако интерфейсы на самом деле не являются правильным уровнем для этого, поскольку они (по замыслу) имеют конкретное значение: они описывают контракт поведения для объекта .Попытка добавить возможность описать контракт для типа изменила бы значение интерфейсов.

3 голосов
/ 23 июля 2010

Нет, вы не можете заставить класс реализовать статические члены.

2 голосов
/ 23 июля 2010

Синтаксис языка C # скрывает его, но надлежащим ключом реализации метода интерфейса является то, что это виртуальный метод.Он скрыт, вы фактически не используете ключевое слово virtual (или переопределяет), когда пишете метод реализации.

Он должен быть виртуальным, именно так интерфейсы реализуются под капотом.Когда вы приводите объект к типу интерфейса, среда выполнения генерирует указатель на раздел таблицы виртуальных методов, который содержит указатели на реализации метода интерфейса.

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

2 голосов
/ 23 июля 2010

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

Интерфейс позволяет вам определять поведение для экземпляра объекта. Статические методы не принадлежат экземпляру объекта, они принадлежат типу. Поэтому определение статических методов в интерфейсе действительно не имеет смысла.

0 голосов
/ 23 июля 2010

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

Другие подобные функции, которых нет в .NET (ну, C #): Классы типов Haskell , Ограничения членов F # для универсальных типов

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