ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【IDL】关键字继承

2022-06-14 17:32:26  阅读:183  来源: 互联网

标签:EXTRA 继承 关键字 IDL ex TEST


关键字继承允许IDL程序使用本身没有定义的关键字参数,可以在调用的时候传递继承的关键字。IDL中的关键字继承一般有以下两种情况:

  • 程序继承 - 允许程序可以非常方便地使用调用继承的关键字和参数。
  • 对象继承 - 在对象继承中,子类可以选择继承超类的方法和属性。

1. 程序继承

在IDL中使用关键字继承需要两个步骤:

1) 程序必须声明接受继承的关键字。可以通过_EXTRA或_REF_EXTRA进行设置。前者通过值传递,后者通过引用传递。

2) 程序通过_EXTRA 或STRICT_EXTRA将继承的关键字传递到被调用的程序中。前后两者的区别在于,当关键字不被接受时的处理方法不同。前者将自动忽略不被接受的关键字,而后者将提示错误并终止执行。

当使用关键字继承时,需要注意以下几点:

  • 关键字继承是以形式参数的格式使用。所以_REF_EXTRA只能出现在参数列表,而不能在调用时使用。
  • 同时使用_EXTRA 和 _REF_EXTRA关键字将会导致错误,只能使用其中一个。
  • 关键字_REF_EXTRA只用在程序调用时,而不能用在参数列表中。
  • 当在调用时,同时使用_EXTRA 和 _STRICT_EXTRA将导致错误,只能使用其中一个。

1.1 _EXTRA 和 _STRICT_EXTRA的区别

示例代码如下:

;_EXTRA - 关键字继承,并且在调用时使用_EXTRA=ex
;对于不能接受的关键字(abc),会自动忽略
PRO TEST_1, x, _EXTRA = ex
 PLOT, x, _EXTRA = ex
  ;查看ex,其实就等于“thick = 2, color = 255, abc = 1”
HELP, ex
END
 
;_EXTRA - 关键字继承,在调用时使用_STRICT_EXTRA = ex
;对于不能接受的关键字(abc),会弹出错误,并停止执行
PRO TEST_2, x, _EXTRA = ex
 PLOT, x, _STRICT_EXTRA = ex
END
 
PRO TEST_EXTRA
  ;abc为错误关键字,此时忽略
 TEST_1, SIN(FINDGEN(100)/10), thick = 2, color = 255, abc = 1 
  ;abc为错误关键字,此时弹出错误,并停止执行
 TEST_2, SIN(FINDGEN(100)/10), thick = 2, color = 255, abc = 1 
END

IDL提供了两种调用机制。使用哪一种,由形式参数列表决定。

1.2 _EXTRA:值传递

调用格式:PRO TEST_1, x, _EXTRA = ex

IDL通过复制参数给调用程序实现参数的传递。当使用_EXTRA进行关键字继承时,IDL创建一个匿名结构体保存这些参数。每一个结构体成员名与继承的关键字同名,成员值保存了关键字设置的值。

继承关键字的修改

当关键字通过值传递后,保存在一个匿名结构体中。调用程序中,可以对参数进行修改。结构体相关函数(如CREATE_STRUCT、N_TAGS、TAG_NAMES)均可使用。如下所示。

PRO TEST_1, x, _EXTRA = ex 
  ;使用ex之前,可以对其进行修改 
  ;判断是否输入了ex
 IF N_ELEMENTS(ex) EQ 0 THEN BEGIN   
   ;设置默认显示风格
   ex = {thick:2, color:255}   
 ENDIF ELSE BEGIN
   ex = ex
 ENDELSE
 
 PLOT, x, _EXTRA = ex
 HELP, ex
END
 
 
PRO TEST_MODIFY_EXTRA 
 TEST_1, SIN(FINDGEN(100)/10) 
 WINDOW, 1
 TEST_1, SIN(FINDGEN(100)/10), color = 255, psym = 5 
END

1.3 _REF_EXTRA:引用传递

调用方法:PRO TEST_1,  x,  _REF_EXTRA = ex

当使用_REF_EXTRA进行关键字继承时,IDL使用普通机制实现参数传递,IDL会创建一个字符串数组进行参数传递。用户可以选择性的设置哪些关键字需要继承。如下所示。

PRO TEST_1, x, _ref_extra = ex
  PRINT, ex 
;只使用thick和color关键字
 PLOT, x, _extra = ['thick','color']
 
 WINDOW, 1
  ;只使用psym关键字
 PLOT, x, _extra = ['psym'] 
END
 
 
PRO TEST_REF_EXTRA
 TEST_1, SIN(FINDGEN(100)/10), thick=2, color=255, psym=4 
END

2. 对象继承

在IDL中提供了许多对象,每个对象都有自己的属性和方法,可以通过IDL帮助Routines (by topic) > Object Class Library目录查看所有对象,包含文件对象、图形对象、网络连接对象、其他对象等。IDL同样提供了自定义类或对象的方法。用户在自定义类的时候,可以选择继承IDL现有对象(包含用户自定义类)的属性和方法。

下面以一个自定义类为例,介绍如何继承对象。

自定义类名为“DoAdd”。属性和方法如下表所示。

 

名称

说明

属性

a

初始值为0

b

初始值为0

方法

SetProperty

可以修改a和b的值

DoAdd_Fun

返回a与b的和

自定义类代码如下:

;返回a+b
FUNCTION DOADD::doAdd_fun
 RETURN, self.A + self.B
END
 
;可以修改a和b
PRO DOADD::SetProperty, a=a,b=b 
 IF N_ELEMENTS(a) THEN self.A = a
 IF N_ELEMENTS(b) THEN self.B = b 
END
 
;类初始化
FUNCTION DOADD::init,a,b 
 IF N_ELEMENTS(a) THEN self.A = a
 IF N_ELEMENTS(b) THEN self.B = b
 RETURN, 1 
END
 
;定义类
PRO DOADD__DEFINE
  struct = {doadd, a:0, b:0}
END

编译之后调用方法如下:

IDL> obj = obj_new('DoAdd', 4,5)
IDL> print, obj.DOADD_FUN()
      9
IDL> obj.SETPROPERTY, a=10
IDL> print, obj.DOADD_FUN()
     15

下面重新自定义一个类inherite_doadd,继承DoAdd类的属性和方法,代码如下:

;编写inherite_doadd类自己的方法,做减法
FUNCTION INHERITE_DOADD::DoSub_Fun
 RETURN, self.a - self.b
END
 
PRO INHERITE_DOADD__DEFINE
  structure = {inherite_doadd, $
   INHERITS DOADD}   ;继承DoAdd  
END

调用如下:

IDL> obj = obj_new('inherite_doadd', 6,7)
IDL> print, obj.DOADD_FUN()
     13
IDL> print, obj.DOSUB_FUN()
     -1
IDL> obj.SETPROPERTY, a = 10    ;此时a=10,b=7
IDL> print, obj.DOSUB_FUN()
      3
IDL> print, obj.DOADD_FUN()
     17

 

标签:EXTRA,继承,关键字,IDL,ex,TEST
来源: https://www.cnblogs.com/enviidl/p/16375491.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有