У меня есть 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 и КонструкторФинал. Почему я не назвал их только Конструктор, поскольку они находятся в разных модулях, они не должны перегружать друг друга? Я попытался дать им такое же имя, но затем у меня возникла ошибка при вызове конструктора в клиентском коде. -> Это означает, что для каждого класса я должен был добавить дополнительный суффикс после «Конструктора».
Я хотел бы иметь возможность, независимо от того, сколько разных классов, использовать только слово Конструктор для построения объекта в каждом классе. Но в клиентском коде для создания объекта я буду использовать точное имя этого типа. Это возможно?
прежде всего, взгляните на этот ответ, чтобы узнать об истинной природе "настраиваемых конструкторов" Фортрана.
@RodrigoRodrigues очень интересные факты, большое вам спасибо. Но все же это не ответ на мой вопрос.
Скажем, я не использую процедуру внутри интерфейсного блока. И я использую только «конструктор структуры» (как они называют это в книге fortran). В 4.4.15 Structure Constructor и следуя правилу, описанному в примере 4 в Fortran 2003 HandBook, я ожидал, что при вызове TYPE(ResultsPublisherInitial):: initial
мой код будет успешно скомпилирован. initial = ResultsPublisherInitial(param1, param2, param3, param4)
. Но я получаю ошибку № 6593: количество выражений в конструкторе структуры отличается от количества компонентов производного типа.
Я провел короткий поиск и нашел это, но не уверен в выводе - как он должен себя вести в конце. software.intel.com/en-us/forums/…
Добро пожаловать, используйте тег Фортран для всех вопросов по Fortran.