Итак, обновился я до версии Intel Fortran 11.1.051 Update 3. Посмотрел особенности релиза и обнаружил, что наконец-то интеловцы сделали хоть какое-то дееспособное ООП согласно стандарту 2003. Многое ещё не поддерживается, кое-какие места не ясны по уровню реализации, т.к. сами интеловцы пишут, что не успевают доработать справку Итак, первый примерчик Этого ООП.
Сразу оговорюсь, что переопределить методы setPoint и getPoint как это я реализовал в NAG Fortran 5.2 не удалось. Похоже, что type-bound procedures ещё очень сырые
Классы двух и трехмерных координат.
Код | ! mod_coords.f03 ! Файл содержит тестовый пример класса "координата 2D" для анализа совместимости компилятора ! IVFC 11.1.051 со стандартом 2003 ! Попов Д.А. ! [email protected]
module coords ! Объявим простейший модуль, содержащий тип "координата" implicit none type :: TCoord real(8) :: x,y contains ! инкапсулируем методы ! Объявим соответствующие методы для чтения и записи приватных ! переменных x и y ! ключевое слово procedure указывает, что это именно подпрограмма ! атрибут pass, что первый аргумент соответствующего метода - сам объект, ! т.е. this (this не являеся ключевым или зарезервированным словом) ! Объявляем все эти процедуры открытыми в классе procedure, pass, public :: getx procedure, pass, public :: gety procedure, pass, public :: setx procedure, pass, public :: sety procedure, pass, public :: getPoint=>getPoint2D procedure, pass, public :: setPoint=>setPoint2D end type TCoord
! И скрываем их реализацию в модуле private :: getPoint2D, setPoint2D private :: getx, gety, setx, sety
! Методы ничем не отличаются от обычных процедур и функций, кроме, разве что ! используется class, а не type при описании формальных параметров-экземпляров ! нашего типа. Так требуется делать потому что это полиморфный тип. contains ! Читаем x и y соответственно real(8) function getx(this) implicit none class(TCoord), intent(in) :: this getx = this%x end function getx real(8) function gety(this) implicit none class(TCoord), intent(in) :: this gety = this%y end function gety function getPoint2D(this) implicit none class(TCoord), intent(in) :: this ! На выход массив из трех точек real(8), dimension(1:2) :: getPoint2D ! Если работает ASSOCIATE, то переопределим на время работы функции ! длинные и не удобные имена this%x и т.п. Это улучшает читаемость кода ! Синтаксис конструкции associate таков: ! псевдопеременные - это не указатели, хотя оператор используется тот же ! [имя:] associate (список_переименований) ! тело ! end associate [имя] associate (x=>this%x, y=>this%y) getPoint2D = (/x,y/) end associate end function getPoint2D ! устанавливаем x и y subroutine setx(this,x) implicit none class(TCoord), intent(out) :: this real(8), intent(in) :: x this%x = x end subroutine setx subroutine sety(this,y) implicit none class(TCoord),intent(out) :: this real(8), intent(in) :: y this%y = y end subroutine sety subroutine setPoint2D(this, V) implicit none class(TCoord), intent(in) :: this ! На выход массив из трех точек real(8), dimension(1:2), intent(in) :: V associate (x=>this%x, y=>this%y) x= V(1); y = V(2); end associate end subroutine setPoint2D end module coords
|
Код | ! mod_coords3D.f03 ! Файл содержит тестовый пример класса "координата 3D" (наследник "координата 2D")для анализа ! совместимости компилятора IVFC 11.1.051 со стандартом 2003 ! Попов Д.А. ! [email protected]
module coords3D use coords implicit none ! Унаследуем наш тип от типа TCoord type, extends(TCoord) :: TCoord3D real(8), private :: z ! Добавим координату Z contains procedure, pass, public :: getz ! И аналогичные методы procedure, pass, public :: setz end type TCoord3D
private :: getz, setz contains ! Для чтения z real(8) function getz(this) implicit none class(TCoord3D), intent(in) :: this getz = this%z end function getz ! устанавливаем теперь еще и z subroutine setz(this,z) implicit none class(TCoord3D), intent(out) :: this real(8), intent(in) :: z this%z = z end subroutine setz end module coords3D
|
Код | ! demo_coords3D.f03 ! Файл содержит тестовый пример работы с классами Coord и Coord3D для тестирования ! совместимости компилятора IVFC 11.1.051 со стандартом 2003 ! Попов Д.А. ! [email protected]
program coord_test use coords use coords3D implicit none ! Объявим переменную типа TCoord3D type(TCoord) :: a,b type(TCoord3D) :: c ! Зададим им значения call a%setx(10.0_8) call a%sety(-10.0_8) call b%setPoint((/-1.0_8,2.0_8/)) print *,"a = ",a%getPoint() print *,"b.x = ", b%getx(), " b.y = ",b%gety()
call c%setx(100.0_8) call c%sety(110.0_8) call c%setz(220.0_8)
print *, "c.z = ",c%getz() print *, "Press ENTER for exit" read(*,*) end program coord_test
|
|