其他分享
首页 > 其他分享> > 【IDL】关键字继承

【IDL】关键字继承

作者:互联网

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

1. 程序继承

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

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

2) 程序通过_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