next up previous contents
След.: Родовые интерфейсы и перегрузка Выше: Интерфейсы Пред.: Определение интерфейса   Содержание


Родовые интерфейсы и родовые имена

Одной из возможностей, предоставляемой родовыми интерфейсными блоками, является задание родового имени процедуры. Это означает общее имя для ряда процедур, отличающихся типом (и, возможно, количеством) аргументов, а у функций могут также отличаться типы (возвращаемых значений). Каждая процедура имеет свое специфическое имя, но может быть вызвана с использованием родового -- компилятор выбирает специфическую функцию по контексту -- то есть, по типу параметров и, для функций, по типу, который требуется в данном контексте. Примером является синус, который определен для аргументов типа REAL, DOUBLE PRECISION и COMPLEX: соответствующие специфические имена SIN, DSIN и CSIN, но их можно даже не знать, поскольку имеется родовое имя SIN, применимое для всех трех типов и возвращающее результат соответствующего типа. Родовое имя группы функций задается именем интерфейса, в котором специфические подпрограммы описаны. Все объединяемые подпрограммы должны быть процедурами или все -- функциями. Они должны отличаться количеством и/или типом (или разновидностью типа) своих параметров. Если несколько интерфейсов имеют одно имя, то определяемые в них группы процедур объединяются. Это позволяет расширять род процедур. Если интерфейс неизвестен, он указывается; модульные процедуры, интерфейс которых известен, указываются с помощью оператора PROCEDURE. Пример [14]:

INTERFACE SWITCH

SUBROUTINE INT_SWITCH(X, Y)

INTEGER, INTENT(INOUT) :: X, Y

END SUBROUTINE INT_SWITCH

SUBROUTINE REAL_SWITCH(X, Y)

REAL, INTENT(INOUT) :: X, Y

END SUBROUTINE REAL_SWITCH

SUBROUTINE COMPLEX_SWITCH(X, Y)

COMPLEX, INTENT(INOUT) ::

END SUBROUTINE COMPLEX_SWITCH

END INTERFACE SWITCH

Каждую из трех подпрограмм можно вызвать по родовому имени SWITCH или по личному имени.

Родовое имя может совпадать с именем производного типа. Это позволяет эмулировать конструкторы объектов по аналогии с C: различные процедуры, создающие объект производного типа, объединяются под одним именем. Удобно, если процедра -- это функция, возвращающая объект этого типа. Пример из [14]: MODULE mytype_module

TYPE mytype

PRIVATE

COMPLEX value

END TYPE

INTERFACE mytype

MODULE PROCEDURE int2mytype

END INTERFACE

CONTAINS

TYPE(mytype) FUNCTION int2mytype(i)

INTEGER,INTENT(IN) :: i

int2mytype%value = CMPLX(i)

END FUNCTION

END

PROGRAM example

USE mytype_module

TYPE(mytype) x

x = mytype(17)

END

Разумеется, таких «конструкторов» может быть больше одного.



Ilya A. Chernov 2012-12-19
X