В информатике , A типа подпись или типа аннотация определяет входы и выходы для функции, подпрограммы или методы . Сигнатура типа включает количество, типы и порядок аргументов, содержащихся в функции. Сигнатура типа обычно используется при разрешении перегрузки для выбора правильного определения вызываемой функции среди множества перегруженных форм.
Примеры
C / C ++
В C и C ++ сигнатура типа объявляется так называемым прототипом функции . В C / C ++ объявление функции отражает ее использование ; например, указатель на функцию с подписью будет называться:(int)(char, double)
char c ; двойной d ; int retVal = ( * fPtr ) ( c , d );
Erlang
В Erlang сигнатуры типов могут быть необязательно объявлены как:
- спецификации ( function_name ( type1 (), типа2 (), ...) -> out_type ()).
Например:
- spec ( is_even ( number ()) -> boolean ()).}}
Haskell
Сигнатура типа в Haskell обычно принимает следующую форму:
functionName :: arg1Type -> arg2Type -> ... -> argNType
Обратите внимание, что тип результата может рассматриваться как все, что находится за первым предоставленным аргументом. Это следствие каррирования , которое стало возможным благодаря поддержке Haskell функций первого класса ; для этой функции требуются два входа, в которых указан один аргумент, и функция "каррирована" для создания функции для не предоставленного аргумента. Таким образом, вызов where дает новую функцию, которую можно вызвать для создания .f x
f :: a -> b -> c
f2 :: b -> c
f2 b
c
Фактические спецификации типа могут состоять из фактического типа, например Integer
, или переменной общего типа, которая используется в параметрических полиморфных функциях , например a
, или b
, или anyType
. Итак, мы можем написать что-то вроде:functionName :: a -> a -> ... -> a
Поскольку Haskell поддерживает функции высшего порядка , функции можно передавать как аргументы. Это записывается как:functionName :: (a -> a) -> a
Эта функция принимает функцию с сигнатурой типа и возвращает данные типа out.a -> a
a
Ява
В виртуальной машине 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 сигнатура метода состоит из имени и количества, типа и порядка его параметров. Типы возвращаемых данных и вызванные исключения не считаются частью сигнатуры метода, равно как и имена параметров; они игнорируются компилятором для проверки уникальности метода.
Например, следующие два метода имеют разные сигнатуры:
void doSomething ( String [] x ); // doSomething (String []) void doSomething ( String x ); // doSomething (String)
Следующие три метода имеют одинаковые подписи:
int doSomething ( int x ); // doSomething (int) void doSomething ( int y ) throws Exception ; // doSomething (число)
Юлия
В Julia сигнатуры функций имеют следующий вид:
комиссия ( продажа :: Int , ставка :: Float64 ) :: Float64
Типы в аргументах используются для множественной отправки . Тип возвращаемого значения проверяется, когда функция возвращает значение, и возникает исключение времени выполнения, если тип значения не соответствует указанному типу.
Абстрактные типы разрешены и приветствуются для реализации общего поведения, общего для всех подтипов. Таким образом, указанная выше функция может быть переписана следующим образом. В этом случае функция может принимать любые подтипы Integer и Real соответственно.
комиссия ( продажа :: Integer , ставка :: Real ) :: Real
Типы полностью необязательны в аргументах функции. Когда он не указан, это эквивалентно использованию типа Any, который является супертипом всех типов. Идиоматично указывать типы аргументов, но не возвращаемый тип.
Цель-C
В языке программирования Objective-C сигнатуры методов для объекта объявляются в файле заголовка интерфейса. Например,
- ( id ) initWithInt: ( int ) значение ;
определяет метод, initWithInt
который возвращает общий объект (an id
) и принимает один целочисленный аргумент. Objective-C требует, чтобы тип в сигнатуре был явным, когда тип не является id
; эта подпись эквивалентна:
- initWithInt: ( int ) значение ;
Ржавчина
В Rust сигнатуры функций имеют следующий вид:
fn комиссия ( продажа : u32 , курс : f64 ) -> f64 ;
Рекомендации
- ^ «Справочник по C ++: термины программирования» . Проверено 3 декабря 2013 года .
- ^ Пол Лихи. «Подпись метода» . http://www.about.com/ : Руководство About.com . Проверено 31 мая 2011 .
Подпись метода является частью объявления метода. Это комбинация имени метода и списка параметров.
- ^ Мёссенбёк, Ханспетер (25 марта 2002 г.). «Расширенный C #: переменное количество параметров» (PDF) . http://ssw.jku.at/Teaching/Lectures/CSharp/Tutorial/ : Institut für Systemsoftware, Johannes Kepler Universität Linz, Fachbereich Informatik. п. 52 . Проверено 3 августа 2011 .