2011-12-23 7 views
19

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

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

interface IRenderable 
{ 
    void Render(GameTime); 
} 

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

interface IRenderable 
{ 
    void Render(GameTime gameTime); 
} 

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


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

+0

Я думаю, что бы имена метод подписи соответствует !!! –

+0

См. Мой отредактированный последний комментарий. –

+1

То, что я имею в виду, похоже на то, что декларации методов являются согласованными между классами и интерфейсами ... –

ответ

19

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

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

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 через интерфейс или через класс, определяет, доступны ли параметры по умолчанию и каково их значение.

+0

Интерфейсы были там до необязательных и именованных параметров. :) – CodeCaster

+0

@CodeCaster Хороший крик, скорее всего, не оригинальная причина, но это определенно причина сейчас :) Я предполагаю, что возможность будущих функций, таких как это, была причиной, по которой они назвали их. – Lukazoid

+0

@ Лукозавод, молодец. Это самый логичный ответ, какой бы вы ни смотрели на него. –

9

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

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

+0

плюс это делает его совместимым с объявлениями методов в классах. – Thilo

+2

«Представьте себе трудность, если никакие параметры не имели значимых имен!» - просто напишите некоторые Java в Eclipse, большинство имен параметров показаны как «arg0» и т. д. ... – Adam

+1

@codesparkle Это звучит так же весело, как чтение через мини-файл JavaScript! –

0

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

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

1

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

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

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

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

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

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

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

void Foo(string, string, int) 

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

2

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

К примеру ...

interface IRenderable 
{ 
    void Render(TimeSpan gameTime); 
} 

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

interface IRenderable 
{ 
    void Render(TimeSpan); 
}