Уважаемые пользователи и разработчики FORTRAN,
Я пытаюсь понять объектно-ориентированные концепции в стандартах FORTRAN 2003 (или позже). У меня есть некоторые знания на С++, поэтому я думаю, что между этими двумя языками существуют некоторые общие идеи, которые могут помочь мне лучше понять их. Пожалуйста, помогите мне немного разъяснить, так как я не нашел слишком много полезных объяснений в Интернете.
В С++ полиморфизм выполняется посредством деривации класса и переопределения функции-члена. Один определяет "абстрактный" базовый класс, где определены почти все виртуальные функции. Различные производные классы содержат фактическую их реализацию. Поэтому другие функции просто нужно программировать на основе "абстрактного" класса. Затем они работают для всех производных классов.
Я думаю, что в FORTRAN OOP выполняется аналогичным образом, но есть некоторые отличия. На мой взгляд, необходимо определить базовый тип с некоторыми виртуальными функциями, как С++. И другие функции/подпрограммы должны следовать определению функции-члена в базовом типе. То, что способ разрешения повторного использования функции/подпрограмм для всех расширяет типы.
У меня нет лучшей идеи о том, как программировать идею. Вот моя первая попытка:
type Basis
integer :: NBasis
contains
private
procedure :: DoNothing
generic, public :: Constructor => DoNothing
generic, public :: AllocateBasis => DoNothing
endtype Basis
type, extends(Basis) :: GridBasis
private
integer :: NGrid
contains
private
procedure :: ConstructorGrid1
procedure :: ConstructorGrid2
generic, public :: Constructor => ConstructorGrid1, ConstructorGrid2, ConstructorGrid3
procedure :: AllocateGridReal
procedure :: AllocateGridCplx
generic, public :: AllocateBasis => AllocateGridReal, AllocateGridCplx
endtype GridBasis
-
Во-первых, как я могу определить "AllocateBasis" в типе Basis, чтобы он работал как "виртуальная функция", и все расширенные типы должны определять свою собственную версию "AllocateBasis" ?
-
Во-вторых, как я могу определить "AllocateBasis" в типе GridBasis? Здесь определение содержит реальную реализацию.
-
В-третьих, как я могу сделать "AllocateBasis" в виде GridBasis функцией перегрузки? то есть есть реальная версия и сложная версия, и оба они называются "AllocateBasis" с реальными или сложными массивами ввода-вывода.
-
В-четвертых, NOPASS против PASS. Насколько я понимаю, если PASS установлен, то есть явный указатель на объект. Но когда NOPASS установлен, такого не происходит. Таким образом, PASS упрощается для разъяснения?
Я ценю любые комментарии.
Edit1:
Edit1 Удалено, поскольку это не имеет никакого отношения к вопросу.