- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Fortran90 中编码,即使我知道应该避免它,我也需要使用抽象类型。现在我想定义一个函数,它可以在参数中采用抽象类型或派生类型。为此,我想创建两个函数的接口(interface),但出现以下错误:
Ambiguous interfaces 'initialize_abstract' and 'initialize_logic' in generic interface 'initialize' at (1)
代码如下:
type type1
contains
procedure, pass(transf) :: initialize_logic
procedure, pass(transf) :: initialize_abstract
end type
interface initialize
module procedure initialize_logic
module procedure initialize_abstract
end interface
function initialize_logic(element, element_logic)
type(type1), pointer :: element
type(type_logic), pointer :: element_logic
end function
function initialize_abstract(element, element_abstract)
type(type1), pointer :: element
class(type_abstract), pointer :: element_abstract
end function
type_abstract 是从 type_logic 扩展而来的。
我不知道如何摆脱这个消息错误,我真的需要能够用抽象类型或扩展类型(这里:“logic_type”)调用它,例如:
class(type_abstract), pointer :: element_abstract
type(type_logic), pointer :: element_logic
type(type1) :: e1, e2
call e1%initialize(element_abstract)
call e2%initialize(element_logic)
如果我只有一个初始化器,接受抽象类的参数,在使用扩展类型初始化时,我会得到以下错误:
Error: Actual argument to 'element_abstract' at (1) must have the same declared type
有什么想法吗?提前谢谢你
最佳答案
编辑:完全重做,添加了抽象类方法。
有两种方法可以做到这一点。在运行时使用select type
构造来确定element
的动态类型,以调用正确的初始化过程。
另一种方法使用抽象类来声明延迟过程initialize_t1
,每个子类将以不同方式实现该过程。请注意两件事,首先,我将其中一种派生类型称为 abstract
以保持您的命名约定,但它相当困惑并且不是一个好的做法。然后将真正的抽象类称为 veryAbstract
以暗示其用途并仍然保持您的命名约定。另一点需要注意的是,initialize_from_...
过程绑定(bind)到 veryAbstract
子类,而不是 type1
类。这可能令人困惑,但这是实现您所追求的目标的技巧。
这两种方式都使用ifort 14进行了测试。
方法 1(选择类型):
module test2
type abstract
integer :: x
contains
end type abstract
type, extends(abstract) :: logic
integer :: y
contains
end type logic
type type1
integer :: x
contains
procedure :: initialize => initialize_type1
procedure :: initialize_abstract
procedure :: initialize_logic
end type type1
contains
subroutine initialize_abstract(this,element)
class(type1), intent(inout) :: this
class(abstract), intent(in) :: element
this%x = element%x
end subroutine initialize_abstract
subroutine initialize_logic(this,element)
class(type1), intent(inout) :: this
class(logic), intent(in) :: element
this%x = element%y
end subroutine initialize_logic
subroutine initialize_type1(this,element)
class(type1), intent(inout) :: this
class(abstract), intent(in) :: element
select type (element)
type is (abstract)
call this%initialize_abstract(element)
type is (logic)
call this%initialize_logic(element)
class default
print*,"ERROR: Unknown type of the 'element' argument in 'initialize_type1'."
stop
end select
end subroutine initialize_type1
end module test2
方法 2(抽象类):
module test3
type type1
integer :: x
contains
procedure :: initialize => initialize_type1
end type type1
type, abstract :: veryAbstract
contains
procedure(init_t1), deferred :: initialize_t1
end type veryAbstract
abstract interface
subroutine init_t1(this,t1)
import veryAbstract
import type1
class(veryAbstract), intent(in) :: this
class(type1), intent(inout) :: t1
end subroutine
end interface
type, extends(veryAbstract) :: abstract
integer :: x
contains
procedure :: initialize_t1 => initialize_type1_from_abstract
end type abstract
type, extends(abstract) :: logic
integer :: y
contains
procedure :: initialize_t1 => initialize_type1_from_logic
end type logic
contains
subroutine initialize_type1(this,element)
class(type1), intent(inout) :: this
class(abstract), intent(in) :: element
call element%initialize_t1(this)
end subroutine initialize_type1
subroutine initialize_type1_from_abstract(this,t1)
class(abstract), intent(in) :: this
class(type1), intent(inout) :: t1
t1%x = this%x
end subroutine initialize_type1_from_abstract
subroutine initialize_type1_from_logic(this,t1)
class(logic), intent(in) :: this
class(type1), intent(inout) :: t1
t1%x = this%y
end subroutine initialize_type1_from_logic
end module test3
测试程序:
PROGRAM test
use test2
!use test3
type(abstract) :: a1
type(logic) :: l1
type(type1) :: t1
type(type1) :: t2
a1%x = 1
l1%x = 2
l1%y = 7
call t1%initialize(a1)
call t2%initialize(l1)
print*,'t1%x: ',t1%x
print*,'t2%x: ',t2%x
end
关于generics - 在 Fortran 90 中为抽象类型创建接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25683298/
我需要将文本放在 中在一个 Div 中,在另一个 Div 中,在另一个 Div 中。所以这是它的样子: #document Change PIN
奇怪的事情发生了。 我有一个基本的 html 代码。 html,头部, body 。(因为我收到了一些反对票,这里是完整的代码) 这是我的CSS: html { backgroun
我正在尝试将 Assets 中的一组图像加载到 UICollectionview 中存在的 ImageView 中,但每当我运行应用程序时它都会显示错误。而且也没有显示图像。 我在ViewDidLoa
我需要根据带参数的 perl 脚本的输出更改一些环境变量。在 tcsh 中,我可以使用别名命令来评估 perl 脚本的输出。 tcsh: alias setsdk 'eval `/localhome/
我使用 Windows 身份验证创建了一个新的 Blazor(服务器端)应用程序,并使用 IIS Express 运行它。它将显示一条消息“Hello Domain\User!”来自右上方的以下 Ra
这是我的方法 void login(Event event);我想知道 Kotlin 中应该如何 最佳答案 在 Kotlin 中通配符运算符是 * 。它指示编译器它是未知的,但一旦知道,就不会有其他类
看下面的代码 for story in book if story.title.length < 140 - var story
我正在尝试用 C 语言学习字符串处理。我写了一个程序,它存储了一些音乐轨道,并帮助用户检查他/她想到的歌曲是否存在于存储的轨道中。这是通过要求用户输入一串字符来完成的。然后程序使用 strstr()
我正在学习 sscanf 并遇到如下格式字符串: sscanf("%[^:]:%[^*=]%*[*=]%n",a,b,&c); 我理解 %[^:] 部分意味着扫描直到遇到 ':' 并将其分配给 a。:
def char_check(x,y): if (str(x) in y or x.find(y) > -1) or (str(y) in x or y.find(x) > -1):
我有一种情况,我想将文本文件中的现有行包含到一个新 block 中。 line 1 line 2 line in block line 3 line 4 应该变成 line 1 line 2 line
我有一个新项目,我正在尝试设置 Django 调试工具栏。首先,我尝试了快速设置,它只涉及将 'debug_toolbar' 添加到我的已安装应用程序列表中。有了这个,当我转到我的根 URL 时,调试
在 Matlab 中,如果我有一个函数 f,例如签名是 f(a,b,c),我可以创建一个只有一个变量 b 的函数,它将使用固定的 a=a1 和 c=c1 调用 f: g = @(b) f(a1, b,
我不明白为什么 ForEach 中的元素之间有多余的垂直间距在 VStack 里面在 ScrollView 里面使用 GeometryReader 时渲染自定义水平分隔线。 Scrol
我想知道,是否有关于何时使用 session 和 cookie 的指南或最佳实践? 什么应该和什么不应该存储在其中?谢谢! 最佳答案 这些文档很好地了解了 session cookie 的安全问题以及
我在 scipy/numpy 中有一个 Nx3 矩阵,我想用它制作一个 3 维条形图,其中 X 轴和 Y 轴由矩阵的第一列和第二列的值、高度确定每个条形的 是矩阵中的第三列,条形的数量由 N 确定。
假设我用两种不同的方式初始化信号量 sem_init(&randomsem,0,1) sem_init(&randomsem,0,0) 现在, sem_wait(&randomsem) 在这两种情况下
我怀疑该值如何存储在“WORD”中,因为 PStr 包含实际输出。? 既然Pstr中存储的是小写到大写的字母,那么在printf中如何将其给出为“WORD”。有人可以吗?解释一下? #include
我有一个 3x3 数组: var my_array = [[0,1,2], [3,4,5], [6,7,8]]; 并想获得它的第一个 2
我意识到您可以使用如下方式轻松检查焦点: var hasFocus = true; $(window).blur(function(){ hasFocus = false; }); $(win
我是一名优秀的程序员,十分优秀!