Подтвердить что ты не робот

Почему мы должны назвать параметры метода интерфейса?

В С# мы должны назвать параметры метода интерфейса.

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

interface IRenderable
{
    void Render(GameTime);
}

Я бы сказал, что приведенное выше так же читаемо и значимо, как и ниже:

interface IRenderable
{
    void Render(GameTime gameTime);
}

Есть ли какая-то техническая причина, почему требуются имена параметров методов на интерфейсе?


Стоит отметить, что реализация метода интерфейса может использовать разные имена в методах интерфейса.

4b9b3361

Ответ 1

Одной из возможных причин может быть использование необязательных параметров.

Если бы мы использовали интерфейс, было бы невозможно указать именованные значения параметров. Пример:

interface ITest
{
    void Output(string message, int times = 1, int lineBreaks = 1);
}

class Test : ITest
{

    public void Output(string message, int numTimes, int numLineBreaks)
    {
        for (int i = 0; i < numTimes; ++i)
        {
            Console.Write(message);
            for (int lb = 0; lb < numLineBreaks; ++lb )
                Console.WriteLine();
        }

    }
}

class Program
{
    static void Main(string[] args)
    {
        ITest testInterface = new Test();
        testInterface.Output("ABC", lineBreaks : 3);
    }
}

В этой реализации при использовании интерфейса в параметрах times и lineBreaks имеются параметры по умолчанию, поэтому при доступе через интерфейс можно использовать значения по умолчанию без именованных параметров, мы не сможем пропустить параметр times и укажите только параметр lineBreaks.

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

Ответ 2

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

Как вы помните, имена параметров не нужны при реализации интерфейса и их можно легко переопределить.
Однако, когда с использованием интерфейса, представьте себе трудность, если никакие параметры не имели значимых имен! Нет intellisense, никаких подсказок, ничего, кроме типа? Тьфу.
Это должно быть самой большой причиной того, что имя всегда требуется.

Ответ 3

Параметр метода интерфейса именования помогает с самостоятельной документацией:

Например...

interface IRenderable
{
    void Render(TimeSpan gameTime);
}

... говорит больше, чем:

interface IRenderable
{
    void Render(TimeSpan);
}

Ответ 4

Я не могу думать о какой-либо обоснованной технической причине, что интерфейсы должны иметь имена.

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

Однако, я думаю, что есть, вероятно, 3 основные причины, по которым они были необходимы:

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

2) Для тех языков, которые поддерживают автоматическое создание членов интерфейса в классе реализации (т.е. VB), вероятно, гораздо проще создать реализацию интерфейса с использованием заранее определенных имен, чем пытаться создавать имена на лету.

3) Так как интерфейс может быть открыт вне определяющего приложения, имена удаляют неоднозначность, связанную с некорректным интерфейсом.

Например, попытка реализовать метод интерфейса:

void Foo(string, string, int)

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

Ответ 5

Хорошо, эта возможность кажется почти излишней, но, может быть, поэтому, когда вы позволите Visual Studio реализовать интерфейс и заглушить свойства и методы, он знает, как назвать параметры?

С другой стороны, VS не имеет проблем с общим назначением элементов управления...