Из Википедии, бесплатной энциклопедии
  (Перенаправлено из сигнатуры метода )
Перейти к навигации Перейти к поиску

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

Примеры [ править ]

C / C ++ [ править ]

В C и C ++ сигнатура типа объявляется так называемым прототипом функции . В C / C ++ объявление функции отражает ее использование ; например, указатель на функцию , который будет вызываться как:

char  c ; двойной  d ; int  retVal  =  ( * fPtr ) ( c ,  d );

имеет подпись:

( интервал )  ( символ ,  двойной );

Эрланг [ править ]

В Erlang сигнатуры типов могут быть необязательно объявлены как:

- спецификации ( function_name ( type1 (),  типа2 (),  ...)  ->  out_type ()).

Например:

- spec ( is_even ( number ())  ->  boolean ()).

Haskell [ править ]

Сигнатура типа в языке программирования Haskell обычно записывается в следующем формате:

functionName  ::  arg1Type  ->  arg2Type  ->  ...  ->  argNType

Обратите внимание, что тип результата может рассматриваться как все, что находится за первым предоставленным аргументом. Это следствие каррирования , которое стало возможным благодаря поддержке Haskell функций первого класса ; для этой функции требуются два входа, в которых указан один аргумент, и функция "каррирована" для создания функции для не предоставленного аргумента. Таким образом, вызов where дает новую функцию, которую можно вызвать для создания .f xf :: a -> b -> cf2 :: b -> cf2 bc

Фактические спецификации типа могут состоять из фактического типа, например Integer, или переменной общего типа, которая используется в параметрических полиморфных функциях , например a, или b, или anyType. Итак, мы можем написать что-то вроде:functionName :: a -> a -> ... -> a

Поскольку Haskell поддерживает функции высшего порядка , функции можно передавать как аргументы. Это записывается как:functionName :: (a -> a) -> a

Эта функция принимает функцию с сигнатурой типа и возвращает данные типа out.a -> aa

Java [ править ]

В виртуальной машине Java , внутренние сигнатуры типов используются для идентификации методов и классов на уровне кода виртуальной машины.

Пример: метод представлен в байт-коде как . Сигнатура метода выглядит так:String String.substring(int, int)Ljava/lang/String.substring(II)Ljava/lang/String;main()

public  static  void  main ( String []  args )

А в дизассемблированном байт-коде он принимает форму Lsome/package/Main/main:([Ljava/lang/String;)V

Сигнатура метода для main()метода содержит три модификатора:

  • publicуказывает, что main()метод может быть вызван любым объектом.
  • staticуказывает, что main()метод является методом класса.
  • voidуказывает, что main()метод не имеет возвращаемого значения.

Подпись [ править ]

Сигнатура функции состоит из прототипа функции. Он определяет общую информацию о функции, такую ​​как имя, область действия и параметры. Многие языки программирования используют изменение имен , чтобы передавать больше семантической информации от компиляторов компоновщикам. Помимо искажения, в сигнатуре функции (которая хранится внутри большинства компиляторов) содержится избыток информации, которая недоступна, но может быть доступна. [1]

Понимание понятия сигнатуры функции - важная концепция для всех исследований в области информатики.

  • Современные методы объектной ориентации используют интерфейсы , которые по сути являются шаблонами, созданными из сигнатур функций.
  • C / C ++ использует перегрузку функций с различными сигнатурами.

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

Теория информатики и, в частности, концепция полиморфизма широко используют концепцию сигнатуры функции.

В языке программирования C подпись примерно эквивалентна определению своего прототипа .

Термин «подпись» может иметь другие значения в информатике. Например:

  • Подписи файлов могут идентифицировать или проверять содержимое файла.
  • Сигнатуры базы данных могут идентифицировать или проверять схему или версию базы данных.
  • В семействе языков программирования ML «подпись» используется как ключевое слово, относящееся к конструкции модульной системы, которая играет роль интерфейса .

Подпись метода [ править ]

В компьютерном программировании , особенно объектно-ориентированном программировании , метод обычно идентифицируется по его уникальной сигнатуре метода , которая обычно включает имя метода, а также количество, типы и порядок его параметров . [2] Сигнатура метода - это наименьший тип метода.

Примеры [ править ]

C / C ++ [ править ]

В C / C ++ сигнатура метода - это имя метода, а также количество и тип его параметров , но возможно иметь последний параметр, который состоит из массива значений:

int  printf ( const  char * ,  ...  );

Манипулировать этими параметрами можно с помощью подпрограмм в заголовке стандартной библиотеки .<stdarg.h>

C # [ править ]

Подобно синтаксису C, C # видит в качестве сигнатуры метода его имя, а также количество и тип его параметров, где последний параметр может быть массивом значений: [3]

void  Add ( out  int  sum ,  params  int []  value ); [...] Сложить ( из  суммы ,  3 ,  5 ,  7 ,  11 ,  - 1 );  // сумма == 25

Java [ править ]

В языке программирования Java сигнатура метода - это имя метода, а также количество, тип и порядок его параметров. Типы возвращаемых данных и созданные исключения не считаются частью сигнатуры метода.

methodName ( параметры )  {...}; перерыв ;

Например, следующие два метода имеют разные сигнатуры:

doSomething ( String []  y ); doSomething ( Строка  y );

Следующие три метода имеют одинаковые подписи и считаются одинаковыми, поскольку отличается только возвращаемое значение. Имя параметра не является частью сигнатуры метода и игнорируется компилятором для проверки уникальности метода.

int  doSomething ( int  y )  String  doSomething ( int  x ) int  doSomething ( int  z )  выбрасывает  java . lang . Исключение

Юлия [ править ]

В Юлии сигнатуры функций записываются в следующем формате:

комиссия ( сумма :: Int ,  ставка :: Float64 ) :: Float64

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

Абстрактные типы разрешены и приветствуются для реализации общего поведения, общего для всех подтипов. Таким образом, указанная выше функция может быть переписана следующим образом. В этом случае функция может принимать любые подтипы Integer и Real соответственно.

комиссия ( сумма :: целое число ,  ставка :: реальная ) :: реальная

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

Наконец, идиоматично указывать типы аргументов, но не возвращаемый тип.

Objective-C [ править ]

В языке программирования Objective-C сигнатуры методов для объекта объявляются в файле заголовка интерфейса. Например,

-  ( id ) initWithInt: ( int ) значение ;

определяет метод, initWithIntкоторый возвращает общий объект (an id) и принимает один целочисленный аргумент. Objective-C требует, чтобы тип в сигнатуре был явным, в то время как тип не является явным id; эта подпись эквивалентна:

-  initWithInt: ( int ) значение ;

Ржавчина [ править ]

В Rust сигнатуры функций записываются в следующем формате:

fn  комиссия ( сумма : u32 , ставка : f64 ) -> f64 ;  

Ссылки [ править ]

  1. ^ «Справочник по C ++: термины программирования» . Проверено 3 декабря 2013 года .
  2. ^ Пол Лихи. «Подпись метода» . http://www.about.com/ : Руководство About.com . Проверено 31 мая 2011 . Подпись метода является частью объявления метода. Это комбинация имени метода и списка параметров.
  3. ^ Mössenböck, Hanspeter (2002-03-25). «Расширенный C #: переменное количество параметров» (PDF) . http://ssw.jku.at/Teaching/Lectures/CSharp/Tutorial/ : Institut für Systemsoftware, Университет Йоханнеса Кеплера в Линце, Fachbereich Informatik. п. 52 . Проверено 3 августа 2011 .