Общий класс, реализующий интерфейс с ограничениями [duplicate]

Просто войдите в Mysql с

mysql -u root -p

Затем введите эту команду

select @@version;

. Это даст результат как,

+-------------------------+
| @@version               |
+-------------------------+
| 5.7.16-0ubuntu0.16.04.1 |
+-------------------------+
1 row in set (0.00 sec)
21
задан JoshJordan 24 August 2009 в 00:32
поделиться

6 ответов

Эта функция называется «ковариация возвращаемого типа». C # не поддерживает его по следующим причинам:

1) CLR не поддерживает его. Чтобы заставить его работать на C #, нам нужно просто наплевать целую кучу маленьких вспомогательных методов, которые будут отличать правильный тип возвращаемого значения. Нет ничего, что мешает вам сделать это самостоятельно.

2) Андерс считает, что ковариация возвращаемого типа не является хорошей языковой функцией.

3) \ У нас много приоритетов для языка. У нас ограниченные бюджеты, поэтому мы стараемся делать только самые лучшие функции, которые могут быть доступны в любом выпуске. Конечно, это было бы неплохо, но достаточно легко сделать это самостоятельно, если захочешь. Лучше, чтобы мы тратили время на добавление функций, которые улучшают опыт разработчика или добавляют больше репрезентативной власти на язык.

29
ответ дан Eric Lippert 21 August 2018 в 05:28
поделиться
  • 1
    достаточно справедливо :), спасибо за ответ. – Piotr Czapla 25 August 2009 в 10:36
  • 2
    Знаете ли вы, есть ли какая-либо дополнительная информация о №2? Мне нравится читать о таких языковых проблемах. :) – Sam Harwell 1 April 2010 в 19:39
  • 3
    Ответ Брайана Гидеона на этот вопрос дает пример того, как сделать # 1. – Dan Neely 15 November 2010 в 21:39

Чтобы избежать проблемы, вы можете использовать явную реализацию интерфейса.

class  X : IA, IB
{
  public X test()
  {
    return this;
  }

  IB IA.test()
  {
    return this;
  }
}

interface IA
{
  IB test();
}

interface IB
{
}
15
ответ дан Brian Gideon 21 August 2018 в 05:28
поделиться

Поскольку C # не поддерживает co и contravriance для интерфейсов во время компиляции. Таким образом, реализация метода IA.Test () должна точно соответствовать его объявлению. Однако вы можете вернуть экземпляр X во время выполнения

3
ответ дан Przemaas 21 August 2018 в 05:28
поделиться
public X test();

Вы должны объявить тело для всех методов в любом классе, который не является абстрактным.

Попробуйте следующее:

class X : IA, IB
{
    public IB test()
    {
        return new X();
    }
}

interface IA
{
    IB test();
}
interface IB { };
1
ответ дан skalb 21 August 2018 в 05:28
поделиться

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

Что касается разумной причины ... вероятно, это предпочтительнее точки считывания кода зрения.

Вы можете реализовать интерфейс явно и предоставить альтернативную подпись, которая возвращает X, которая не определена интерфейсом. Если вы знаете, что ваш IA на самом деле является X, вы можете использовать это.

5
ответ дан Thorarin 21 August 2018 в 05:28
поделиться

Это может помочь http://geekswithblogs.net/abhijeetp/archive/2010/01/10/covariance-and-contravariance-in-c-4.0.aspx Вы можете использовать "out "keyword

1
ответ дан user958933 21 August 2018 в 05:28
поделиться
  • 1
    Эта функция для C # 4.0 поддерживается только для общих интерфейсов и делегатов. Это не работает, как указано в примере вопроса, где IA не является общим интерфейсом, а хорошей находкой. См. msdn.microsoft.com/en-us/library/dd233059.aspx . – Bernie White 22 September 2011 в 12:27
Другие вопросы по тегам:

Похожие вопросы: