Почему имена параметров необходимы в определении интерфейса? Мне разрешено выбирать новые имена параметров во время реализации
Не уверен, что это глупый вопрос, но я просто заметил это:
public interface IActivityDao : IDao<Activity>
{
IList<Activity> GetAllSinceSequence(long sequence, int count);
}
public class ActivityDao : AbstractNHibernateDao<Core.Domain.Activity>, IActivityDao
{
public IList<Activity> GetAllSinceSequence(long sequence, int maxRecords)
{
}
}
Внутри моей реализации я назвал свой второй параметр "maxRecords". Тем не менее, в интерфейсе он определяется как "счет". Компилятор по-прежнему рассматривает реализованный интерфейс, что хорошо, но может привести к некоторой двусмысленности. Ясно, что я должен переименовать один из параметров в соответствие с другим.
Я немного поиграл, прежде чем переименовать и заметил что-то интересное. Мне не разрешено объявлять мой интерфейс как:
public interface IActivityDao : IDao<Activity>
{
IList<Activity> GetAllSinceSequence(long, int);
}
Это просто компилятор, который слишком защищен от С# symantics? Какую цель используют имена параметров в методе интерфейса, кроме как сделать код более читаемым? Мне кажется, что он вызывает неоднозначность, если имена параметров не принудительно применяются при реализации.
Ответы
Ответ 1
Имена параметров требуются в объявлении интерфейса для ясности реализации и для справки. Если кто-то использовал ваш интерфейс, имена параметров метода предназначены для самостоятельной документирования, поэтому потребитель интерфейса понимает, что передать методу (например, при просмотре описания метода через IntelliSense)
И да, когда вы реализуете интерфейс, вы можете назвать параметры, которые вы хотите.
Ответ 2
История. Это восходит к самым ранним дням .NET, когда COM управлял миром. Возможность взаимодействия с COM была очень важна тогда, никто никогда не выбрасывает все, чтобы принять совершенно новый стиль программирования.
Что сделало COM-взаимодействие сильно поддерживаемым в .NET в целом. Помимо необходимости иметь именованные аргументы для методов интерфейса, им требуются библиотеки типов.
Интересный угловой случай навсегда - язык С++/CLI. Он принял множество синтаксических правил Си ++, включая возможность опускать имена параметров в объявлениях. Другими словами, это законно:
public interface class IFoo
{
void bar(int, long, double);
};
Экспонент-экспортер библиотеки типов генерирует это объявление:
HRESULT bar(
[in] long p1,
[in] long p2,
[in] double p3);
Очень похожий результат, если вы реализуете интерфейс в классе С#, как автогенерируется IntelliSense:
class FooImpl : cpptemp36.IFoo {
public void foo(int __p1, int __p2, double __p3) {
throw new NotImplementedException();
}
}
Это никого не радует.
Ответ 3
Я бы предположил, что это связано с функцией названных параметров в С#. Т.е. вам нужно указать параметры по имени, а не только по порядку по умолчанию:
IActivityDao dao;
dao.GetAllSinceSequence(count: 1, sequence: 2);
Конечно, имена параметров были бы разными, если объект был выбран как ваш экземпляр.
var concreteDao = (ActivityDao) dao;
concreteDao.GetAllSinceSequence(maxRecords: 1, sequence: 2);
Ответ 4
Позвольте мне спросить вас об этом, есть ли где-нибудь еще в инфраструктуре .net, которая позволяет вам определять сигнатуру метода без имен параметров?
В конце концов все возможно, но большинство вещей есть по какой-то причине, в этом случае я бы предположил, что это предел структуры и дизайна компилятора, и действительно ли это имеет значение?
Вы все-таки определяете контракт на использование, можно было бы ожидать, что они действительно будут там.
Ответ 5
Многие языки, такие как С# и VB, поддерживают имена и аргументы параметров для методов. Без имен аргументов в интерфейсе использование имен и необязательных аргументов было бы невозможным. Именование аргументов также помогает читателю понять намерения и функции интерфейса.