【问题标题】:Relationship between abstract type and generic interface with the same name抽象类型与同名泛型接口的关系
【发布时间】:2021-12-15 03:59:46
【问题描述】:

考虑下面的代码。

MODULE a


TYPE:: concrete

END TYPE concrete


INTERFACE concrete

PROCEDURE constructor

END INTERFACE concrete


CONTAINS


SUBROUTINE constructor

END SUBROUTINE constructor


END MODULE a

据我了解,在这种情况下,通用接口concreteconcrete 类型的构造函数声明为子例程constructor(这是我知道的唯一声明构造函数的方法)。现在考虑下面的代码。

MODULE a


TYPE, ABSTRACT:: abstract

END TYPE abstract


INTERFACE abstract

PROCEDURE what_am_i

END INTERFACE abstract


CONTAINS


SUBROUTINE what_am_i

END SUBROUTINE what_am_i


END MODULE a

这里,我有一个 abstract 类型和一个同名的泛型接口,但根据定义,抽象类型 abstract 不能有构造函数。

所以我的问题是:抽象类型、同名泛型接口和该接口内的过程(在示例中为子例程what_am_i)之间是否有任何关系?如果有,是什么?

【问题讨论】:

    标签: oop constructor interface fortran abstract-data-type


    【解决方案1】:

    类型 abstract 和泛型 abstract 之间的关系与类型 concrete 和泛型 concrete 之间的关系完全相同。

    这种关系简单来说就是“他们有相同的名字”。虽然可以将与类型同名的泛型函数视为构造函数,但它并没有真正的特权地位。

    派生类型的定义意味着默认的结构构造函数与派生类型同名,因此

    type t
      integer i
    end type t
    
    type(t) x
    
    x = t(1)
    
    end
    

    为我们提供了该类型的对象 x 以及预期值。

    如果相反,我们有 x=t(1) 可以解析为特定函数 f,如果函数结果为 t 类型的对象,我们可以将该函数 f 称为构造函数。

    但是完全没有理由为什么f 必须返回t 类型的对象。考虑

    module mod
      implicit none
    
      type t
      end type t
    
      interface t
         module procedure f
      end interface t
    
    contains
    
      function f()
        integer f
        f = 1
      end function f
    
    end module mod
    
    use mod
    implicit none
    
    print *, t()
    
    end
    

    这里很难将f 称为构造函数。

    就是这样:通用abstract 下没有特定函数可以返回构造的abstract 对象,但每个函数都可以返回其他内容。正如通用 concrete 下的特定函数可以返回非 concrete 类型的东西。

    【讨论】:

    • 感谢您的明确答复!因此,抽象类型的定义并不意味着具有相同名称的默认构造函数,因此具有相同名称的泛型接口与抽象类型无关,除了具有相同的名称(这可能被认为是不好的做法,因为两者相互独立)。在您的示例中,类型构造函数t 被解析为f,但f 不返回t 对象。将构造函数解析为不返回该类型对象的函数不是没有意义吗?如果不是没有意义,什么时候有用?
    • 是的,在泛型 t 下有一个特定函数可能会造成混淆,它返回的不是 t 类型的对象。不过,这是您的风格指南所禁止的,而不是语言规范所禁止的。请注意,Fortran 没有将泛型 t 称为构造函数:这只是我们用来向程序员而非编译器解释泛型的目的及其细节的词。如果f 没有构造t,则没有理由将其称为构造函数,但编译器并不关心我们在文档中将f 称为什么。
    猜你喜欢
    • 2010-11-08
    • 2013-10-22
    • 2020-05-14
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    • 2020-01-10
    相关资源
    最近更新 更多