В C ++ можно настроить метод полиморфного абстрактного интерфейса
class parent {
int i;
single j;
void set(int i_value)=0;
void set(single j_value)=0;
};
class child : parent {
void set(int value) {
i = value;
}
void set(single value) {
j = value;
}
};
int main() {
parent *p = new child();
p->set(1); // This sets the i member to 1
p->set(2.0); // This sets the j member to 2.0
}
В этом примере я объявил чистый набор методов виртуального интерфейса, который будет реализован в дочернем классе.Соответствующий метод будет выполняться в зависимости от типа аргументов.
Я пытаюсь настроить то же самое в Fortran 2003, но я не знаю, возможно ли это.Я хочу перегрузить метод set, чтобы он выбирал правильный метод, чтобы уменьшить объем необходимого кода.Я пытался,
MODULE test
TYPE, ABSTRACT :: parent
INTEGER :: i
REAL :: j
CONTAINS
PROCEDURE(parent_set_i), DEFERRED :: set_i
PROCEDURE(parent_set_r), DEFERRED :: set_r
GENERIC :: set => set_i, set_r
END TYPE
INTERFACE
SUBROUTINE parent_set_i(this, value)
IMPORT
CLASS (parent), INTENT(inout) :: this
INTEGER, INTENT(in) :: value
END SUBROUTINE
SUBROUTINE parent_set_r(this, value)
IMPORT
CLASS (parent), INTENT(inout) :: this
REAL, INTENT(in) :: value
END SUBROUTINE
END INTERFACE
TYPE, EXTENDS(parent) :: child
CONTAINS
PROCEDURE(child_set_i) :: set_i
PROCEDURE(child_set_r) :: set_r
END TYPE
CONTAINS
SUBROUTINE child_set_i(this, value)
CLASS (child), INTENT(inout) :: this
INTEGER, INTENT(in) :: value
this%i = value
END SUBROUTINE
SUBROUTINE child_set_r(this, value)
CLASS (child), INTENT(inout) :: this
REAL, INTENT(in) :: value
this%j = value
END SUBROUTINE
END MODULE
PROGRAM example
USE test
CLASS (child), POINTER :: c
CLASS (parent), POINTER :: p
ALLOCATE(c)
p => c
p%set(1)
p%set(2.0)
END PROGRAM
Однако это заканчивается ошибкой компиляции, которая гласит:
PROCEDURE(child_set_i) :: set_i
1
Error: PROCEDURE(interface) at (1) should be declared DEFERRED
Возможно ли это вообще, или мне нужно быть более явным с методами класса?