【IDL】关键字继承
作者:互联网
关键字继承允许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,
当使用_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