Конструкторы в фортране

У меня есть 2 подкласса - ResultsPublisherInitial и ResultsPublisherFinal, расширяющие абстрактный класс ResultsPublisher.

Абстрактный класс похож на:

type, public, abstract::   ResultsPublisher
   type(LAConstraintManagementResults), public, pointer::  lacmResults => null() 
   type(LACM_InputModel), public, pointer::                inputModel => null()
   type(LACM_ForecastResults), public, pointer::           forecast => null()
end type ResultsPublisher

Затем у меня есть 2 подкласса - ResultsPublisherInitial и ResultsPublisherFinal, каждый с конструктором:

type, public, extends(ResultsPublisher)::  ResultsPublisherInitial  
   type(LACM_Model), public, pointer::      lacmModel => null()
end type ResultsPublisherInitial

interface ResultsPublisherInitial
   procedure:: ConstructorInitial
end interface

contains 

type(ResultsPublisherInitial) function ConstructorInitial(lacmResults, inputModel, forecast, lacmModel) 
   type(LAConstraintManagementResults), pointer::        lacmResults
   type(LACM_InputModel), pointer, intent(in)::          inputModel 
   type(LACM_ForecastResults), pointer, intent(in)::     forecast
   type(LACM_Model), pointer, intent(in)::               lacmModel

   ConstructorInitial%lacmResults => lacmResults
   ConstructorInitial%inputModel => inputModel
   ConstructorInitial%forecast => forecast
   ConstructorInitial%lacmModel => lacmModel
end function

-----------------
!
type, public, extends(ResultsPublisher)::  ResultsPublisherFinal  
   type(LR_Model), public, pointer::      lrModel => null()
end type ResultsPublisherFinal

interface ResultsPublisherFinal
   procedure:: ConstructorFinal
end interface

contains 

type(ResultsPublisherFinal) function ConstructorFinal(lacmResults, inputModel, forecast, lacmModel) 
   type(LAConstraintManagementResults), pointer::        lacmResults
   type(LACM_InputModel), pointer, intent(in)::          inputModel 
   type(LACM_ForecastResults), pointer, intent(in)::     forecast
   type(LACM_Model), pointer, intent(in)::               lacmModel

   ConstructorFinal%lacmResults => lacmResults
   ConstructorFinal%inputModel => inputModel
   ConstructorFinal%forecast => forecast
   ConstructorFinal%lacmModel => lacmModel
end function

Как видите, у меня есть 2 конструктора для каждого конкретного типа, представленных через процедуру интерфейса. Названия этих процедур - ConstructorInitial и КонструкторФинал. Почему я не назвал их только Конструктор, поскольку они находятся в разных модулях, они не должны перегружать друг друга? Я попытался дать им такое же имя, но затем у меня возникла ошибка при вызове конструктора в клиентском коде. -> Это означает, что для каждого класса я должен был добавить дополнительный суффикс после «Конструктора».

Я хотел бы иметь возможность, независимо от того, сколько разных классов, использовать только слово Конструктор для построения объекта в каждом классе. Но в клиентском коде для создания объекта я буду использовать точное имя этого типа. Это возможно?

Добро пожаловать, используйте тег Фортран для всех вопросов по Fortran.

Vladimir F 25.10.2018 18:00

прежде всего, взгляните на этот ответ, чтобы узнать об истинной природе "настраиваемых конструкторов" Фортрана.

Rodrigo Rodrigues 26.10.2018 06:27

@RodrigoRodrigues очень интересные факты, большое вам спасибо. Но все же это не ответ на мой вопрос.

Stefan Zivkovic 26.10.2018 11:33

Скажем, я не использую процедуру внутри интерфейсного блока. И я использую только «конструктор структуры» (как они называют это в книге fortran). В 4.4.15 Structure Constructor и следуя правилу, описанному в примере 4 в Fortran 2003 HandBook, я ожидал, что при вызове TYPE(ResultsPublisherInitial):: initial мой код будет успешно скомпилирован. initial = ResultsPublisherInitial(param1, param2, param3, param4). Но я получаю ошибку № 6593: количество выражений в конструкторе структуры отличается от количества компонентов производного типа.

Stefan Zivkovic 26.10.2018 11:34

Я провел короткий поиск и нашел это, но не уверен в выводе - как он должен себя вести в конце. software.intel.com/en-us/forums/…

Stefan Zivkovic 26.10.2018 11:46
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
280
0

Другие вопросы по теме