数学建模社区-数学中国
标题:
Lu系统扩展动态库LuSystem之类及对象
[打印本页]
作者:
forcal
时间:
2011-11-28 20:39
标题:
Lu系统扩展动态库LuSystem之类及对象
类(class)是一个具有数据成员和方法成员的自定义数据结构。类可以继承和派生,类的层次结构是一棵树。
0 u2 E$ B: Q1 s1 k8 e) z
3 p: s7 u7 W( v5 o2 D0 X
类对象(obj)是类的实例。
; z6 k& d! b1 [( u
5 m- r' B! B% w( v' a( S9 z
sys::class{... ...}
:创建类定义
, C$ F9 q7 x2 s% Z; J7 n! q% s
8 _9 t/ T+ o5 T0 L, n' V- S
类定义格式如下:
class{#cMyClass: #cBase1, #cBase2, ... //定义类cMyClass,继承自cBase1和cBase2, ...
' B7 X/ R% C! i9 K
private: //私有数据成员
4 F: L" z6 Y( w$ \/ D, b
#pvMem1, #pvMem2, ...
# F9 s6 B& Z) H. t
public: //公有数据成员
# u4 l) B- h! w5 r% w: O
#plMem1, #plMem2, ...
o" e! y$ C- S4 ^6 m) |7 U' s" ]
method: //方法(函数成员)
! ^3 ~% L. j) N; M) q
#__init__ : @init, #__del__ : @delme, #mFun1 :@Fun1, #mFun2 :@Fun2, ...
8 A- E# W/ v+ V) B7 M- \4 t
};
复制代码
类定义中,类名称、基类名称、成员及方法都是以#开头的标识符,不可重复。类名称在最前面,其次是基类名称;private、public及method的次序是任意的,且可多次定义;方法标识符后必须提供函数句柄。类成员的存储顺序与其定义顺序不一定相同。
0 E, ~6 b$ t6 c; \' W/ x
: }7 s0 ^, A+ y3 ?! `5 O- s" s
#__init__和#__del__只可被定义为方法,其中#__init__用于定义构造函数,#__del__用于定义析构函数。若这两个方法被缺省,其函数句柄被自动指定为0。构造函数和析构函数只有一个参数,即对象本身。
% M, _$ x9 j* w! E
- s( f9 Q% A# J5 M0 e
若方法有不止一个参数,则方法被调用时,第一个参数总是传入对象本身,相当于C++的this指针。
h8 W# h% z! ]% t) N
8 n4 R7 ]/ l$ n$ V; x# n+ K
约定:类名称以字母c开头;私有数据成员以pv开头;公有数据成员以pl开头;方法成员以m开头。
+ w1 {1 Z! [1 Y! t/ J& `
1 b4 L% H& e( e- O
sys:
bj{pClass}
:创建类对象
}, Q* S' o9 G& J
. B# m1 c- b/ e& [2 c: n
pClass是类定义的句柄。
6 x, X% j* X7 i. y( Y- `
* v6 ]% `6 l1 R" N9 |
创建类对象时,将自动调用每一个基类的构造函数#__init__初始化基类对象。对象被销毁时,将自动调用每一个基类的析构函数#__del__销毁基类对象。
5 |! J$ q! Z) }3 l L9 R
# j' ^7 q) S& f' X( p
语句 a.=b 将对象b的内容复制到对象a,要求a和b具有相同的类定义,若类定义中定义了方法#__copy__(有且只有2个参数),将自动调用该方法进行对象复制,否则仅依次复制类成员的值。
2 m t7 ~: A2 Z9 y( Q
( F( j0 z( s7 B$ m1 u' h
(1)类定义
!!!using("sys");
7 w( L! s# L4 Y8 [$ m* F
new[class, #人, public : #姓名, private : #性别, #年龄].o[]; //用函数new定义类,有1个公有成员,2个私有成员。函数o用于输出类定义。
复制代码
结果:
class{#人 :
5 {3 P5 f5 ]7 _6 I- F2 J- Q1 N. `
private:
: j' ]. A5 u' e& G: w6 j
#性别, #年龄,
4 N# b3 T: g" W8 d7 y
public:
: k& {6 g' h9 p3 ~
#姓名,
1 n8 M" u/ z* \/ |
method:
, [. H5 B& j% e
#__init__ : 0, #__del__ : 0
6 {8 @% f' K H2 a0 @
}
复制代码
用函数class定义类更为方便:
!!!using("sys");
4 W' O% M$ C, t8 c' U+ k! t
class[#人, public : #姓名, private : #性别, #年龄].o[]; //用函数new定义类,有1个公有成员,2个私有成员。函数o用于输出类定义。
复制代码
输出结果与上面相同。
: z. K& Z: s# @! Q2 ]
9 b6 A. Z5 j' ^# l/ I. |8 m
(2)单一继承
!!!using("sys");
5 f) K9 X" h9 J
class[#人, public : #姓名, private : #性别, #年龄],
E8 f7 d8 {. w" v6 m# q& S0 ^
class[#学生, #人, public : #学校, #班级].o[];
复制代码
结果:
class{#学生 : #人,
' V. P' e1 L( f2 p
private:
$ O+ d1 k* m) i9 x
y7 v' W% {+ |8 M7 a. H
public:
- U# M% g" `7 c6 W; ?8 M
#学校, #班级,
* b7 g6 t/ o# ^$ `0 Y; K
method:
+ A1 \, H+ |6 v
#__init__ : 0, #__del__ : 0
# V) S: B- I- L( j6 e/ K- a
}
复制代码
(3)类对象
!!!using("sys");
0 g) Y7 P! ~ n: z9 ]
main(:a,b)=
; Z b( J$ J8 w/ i7 X
class[#人, public : #姓名, #性别, #年龄],
9 u) W' ~4 \) l& Q- Y( B$ ]
a=class[#学生, #人, public : #学校, #班级],
+ g" E, y: r9 b) }
b=obj[a],
3 V _$ k5 `* _& H! x4 `
b.#学校="实验中学", b.#班级="二年级", b.#姓名="王强", b.#性别="男", b.#年龄=12,
4 M4 Z8 l$ D: n7 A2 H/ o* P" p6 O
o[b, b.#学校," ", b.#班级," ", b.#姓名," ", b.#性别, " ", b.#年龄, "\r\n"];
复制代码
结果:
class obj{#学生 : #人,
( l8 a4 r& S2 T' D. ^% D, ^4 ^
private:
/ `+ ~$ z% x( S3 h1 P5 T8 @
public:
j9 y% P9 Z+ M
#学校 : 实验中学,
5 _3 C% v$ @% t
#班级 : 二年级
3 V& X% p( }/ W S6 N4 z
}
0 o. V! U7 K3 D4 \0 C
实验中学 二年级 王强 男 12
复制代码
说明:如果基类“#人”中#性别和#年龄被定义为私有成员,将无法直接进行存取。
$ w9 A# A9 ?+ h! L* k1 x* t
# M, |. W+ e9 E( Y8 O
(4)多重继承及构造函数和析构函数
1 g5 M9 s& w2 a7 ^- D
j v; h1 R( ]
例子1:
!!!using("sys");
2 G7 e0 q4 M8 ?* Y. H2 g8 Z
initA(p)= o["\r\nA的构造函数!"];
3 Q6 C; m! h7 M. Y) h- u* v
initB(p)= o["\r\nB的构造函数!"];
0 p% _3 F7 h4 ?
initC(p)= o["\r\nC的构造函数!"];
% X3 P8 ~5 N& u4 b8 }9 Z
initD(p)= o["\r\nD的构造函数!"];
6 T0 ~/ K3 X( {5 o. k0 E/ M- W C
delA(p) = o["\r\nA的析构函数!"];
k, b* J% g# U$ z4 a9 A+ R
delB(p) = o["\r\nB的析构函数!"];
: N& u9 @, q/ k! T. G
delC(p) = o["\r\nC的析构函数!"];
5 i: |/ q: _# D4 a2 E9 J/ B
delD(p) = o["\r\nD的析构函数!"];
4 I7 _' V' J, }' g$ N& ]
main()=
- y7 s6 T, h& B6 L7 p# T
class[#A, method : #__init__ : @initA, #__del__ : @delA],
, G& g& A. y& L" ~7 w0 ~! l( \
class[#B, #A, method : #__init__ : @initB, #__del__ : @delB],
- d) S" v5 ^) d% P' \& [ q6 {
class[#C, #A, method : #__init__ : @initC, #__del__ : @delC],
/ q' P7 E) Z( ~4 L. v$ f5 W
class[#D, #B, #C, method : #__init__ : @initD, #__del__ : @delD].obj[].delete[];
复制代码
结果:
A的构造函数!
5 b( O3 y5 o9 S& L9 j: l7 ~3 p
B的构造函数!
. h- Z' S& a3 }$ k
A的构造函数!
) @9 J& T; V( u+ ]1 q
C的构造函数!
. w/ C1 h/ n6 E7 ]/ k
D的构造函数!
! R1 |. y* R, V Z
D的析构函数!
7 J% }. w3 K& w1 T
B的析构函数!
4 t# P" }) O6 ]' W
A的析构函数!
3 Q& q$ i4 g( `" j0 _
C的析构函数!
1 c4 m+ U( S5 P5 h1 b! d! L
A的析构函数!
复制代码
例子2:
!!!using("sys");
* g6 }7 v3 s: N
initA(p)= p.#a=0;
: O* [2 i9 r. v; L! w. R8 V
initB(p)= p.#a=1;
. h' q& g0 U6 T, I7 {4 I0 }1 X7 R
initC(p)= p.#a=2;
& e! P& i3 [& p' o! v
initD(p)= p.#a=3;
$ z) M3 o/ B, K6 U$ Q
main(:c)=
8 v3 w$ |* T& G
class[#A, public: #a, method : #__init__ : @initA],
, \: g- h, ~% U3 o3 @
class[#B, #A, public: #a, method : #__init__ : @initB],
% } \6 M9 `' `- N
class[#C, #A, public: #a, method : #__init__ : @initC],
9 d; h2 [& i: S3 T! Q2 s' }# t- W
c=class[#D, #B, #C, public: #a, method : #__init__ : @initD].obj[],
- {6 {. n8 k' V3 g: P
o[c.#a," ",c.#B.#a," ",c.#C.#a," ",c.#B.#A.#a," ",c.#C.#A.#a,"\r\n"],
3 M, Q( _ W3 Z8 v2 e& _
c.#B.#A.#a=5, c.#C.#A.#a=6, o[c.#B.#A.#a," ",c.#C.#A.#a,"\r\n"];
复制代码
结果:
3 1 2 0 0
0 F+ y* U i& F. {! g) G3 u' x6 I4 L
5 6
复制代码
例子3:
!!!using("sys");
: }& {/ b! ~& P5 Y1 j* L
initA(p)= p.#a=0;
7 Q# q6 ?( _- B% A U
initB(p)= p.#b=1;
. [7 e" C- S8 O, O8 ^( s; o$ c
initC(p)= p.#c=2;
7 i5 j7 e8 f; c2 p
initD(p)= p.#d=3;
$ j/ r' I/ Q( J9 Q) S" O9 E
main(:c)=
5 C2 ~$ D9 _- N- ]# i9 f6 M
class[#A, public: #a, method : #__init__ : @initA],
+ O* ^: j" T- N0 ~( R
class[#B, #A, public: #b, method : #__init__ : @initB],
\ E1 u) @# b) {6 Z
class[#C, #A, public: #c, method : #__init__ : @initC],
9 Q! A( Q; l7 { R3 q) c7 a
c=class[#D, #B, #C, public: #d, method : #__init__ : @initD].obj[],
2 m6 o/ w& R: V; c! b4 p
o[c.#a," ",c.#b," ",c.#c," ",c.#d,"\r\n"],
0 u& p" ?) `* j! k: U
c.#a=5, c.#b=6, c.#c=7, c.#d=8,
- |$ J/ U( u+ f6 s% }
o[c.#a," ",c.#b," ",c.#c," ",c.#d,"\r\n"],
! X: n+ Z3 W, V
c.#B.#A.#a=11, c.#C.#A.#a=12, o[c.#a," ",c.#B.#A.#a," ",c.#C.#A.#a,"\r\n"];
复制代码
结果:
0 1 2 3
2 m9 F0 I5 N9 P+ f( z3 t) a. Z
5 6 7 8
6 G: j- r: e& Q( C# Z$ c
11 11 12
复制代码
(5)成员函数:第一个参数为对象指针
# |/ d4 H4 q' `0 C
5 v) Y l( R) w' O2 ]
例子1:
!!!using("sys");
' E, [: x1 {+ P9 y! d
setA(p,x)= p.#a=x;
. J' l$ g ^. }. d6 p j
setB(p,x)= p.#a=x;
' M4 @$ R$ Y$ {) B
setC(p,x)= p.#a=x;
: L( `7 c) n3 D' G: R8 ^/ f, ^' ^
getA(p)= p.#a;
9 O6 i6 B& Q; q4 a: G! n7 X
getB(p)= p.#a;
( `8 a# X& S1 w- J' q% L8 c. G9 T
getC(p)= p.#a;
8 o9 N' l, Y5 J5 _$ A8 m
main(:c)=
, R6 J/ v( y. n5 I" C- p- T( x
class[#A, private: #a, method : #mGetA : @getA, #mSetA : @setA],
+ k# |5 J( y8 d. Y& f. I2 G1 h
class[#B, private: #a, method : #mGetB : @getB, #mSetB : @setB],
" E, V, H; M8 ~1 ?/ P
c=class[#C, #A, #B, private: #a, method : #mGetC : @getC, #mSetC : @setC].obj[],
. o! ~4 n. C) H; u* K
c.#mSetA=5, c.#mSetB=6, c.#mSetC=7,
) e! ?% d$ n# d: H! p8 ^
o[c.#mGetA," ",c.#mGetB," ",c.#mGetC,"\r\n"];
复制代码
结果:
5 6 7
复制代码
说明:类的方法成员和数据成员用法几乎相同,但方法可以接受多个参数,如下例。
# a8 o6 w" @: r* A
& D5 w8 A7 z1 K( s+ B [
例子2:
!!!using("sys");
* [1 M* v; W% [% @3 G5 k4 U
out(p,x,y,z)= o[x,y,z,"\r\n"];
; I* W9 T, B- \8 {/ b6 q2 s
main(:c)=
7 G. V/ l/ D+ F) ^+ u
c=class[#A, method : #mOut : @out].obj[],
6 D, M6 n9 P. G" ]6 l: d& i
c.#mOut := [5,6,7],
- u! g) r3 Y% m9 B" W
c.#mOut."***".(888)."***";
复制代码
结果:
567
% X! X I+ k3 ^$ B4 P
***888***
复制代码
(6)类对象复制
!!!using("sys");
, k5 k i% X) C/ D
setA(p,x,y)= p.#a=x, p.#b=y;
# m$ x( ~7 X% _0 C6 l: n/ _( C
sumA(p)= p.#a+p.#b;
" m& f" \3 P0 A0 G. o; k# Z
copyAB(s,t)= s.#a=t.#a, s.#b=t.#b;
% H. W4 r) I: f
class[#A, private : #a, public : #b, method : #__copy__ : @copyAB, #setA : @setA, #sumA : @sumA],
* F: h! s5 y; a2 b$ X
class[#B, #A, private : #a, public : #b, method : #__copy__ : @copyAB];
3 I) B7 c s9 _1 ?* t
main(:a,b)=
' c8 f( V9 K; p. |/ I
a=obj[class_handle(#B)], b=obj[class_handle(#B)],
: A U/ T0 z) L& T o# G3 z
a.#a=1, a.#b=2, a.#setA:=[8,9],
7 a, t4 b6 Z; D. {$ x8 ^' y+ r
b.=a,
0 d x9 z, X2 M; Z7 h8 S
b.#a+b.#b+b.#sumA;
复制代码
结果:
8 g I7 `) Y# c
; F _8 N5 R: X& g' _
20
# t7 z" y$ B- Q; r9 G
$ M: X) r+ g. t) K5 F/ S
(7)多态性
!!!using("sys");
. l4 y$ I' Z& e4 _ R
getA()= 1;
2 x0 n+ c; C4 {: ?+ H4 C2 k
getB()= 2;
- ~1 P( w$ r- G0 n5 u* i0 z6 M( r4 l8 s
getC()= 3;
. P% Q; ~/ R1 x( H
class[#A, method : #mGet : @getA],
% e7 w* P3 }$ F# d4 ~
class[#B, #A, method : #mGet : @getB],
: r0 r2 ^% ^5 E; S X" a0 L; ]5 I
class[#C, #B, method : #mGet : @getC];
/ U7 x& h2 b4 @- g; w3 ?6 a8 L
main(:a,b,c)=
6 H' \6 M4 X5 C+ Y% P+ [' n7 P' m
c=obj[class_handle(#C)],
: U/ t- m3 J- |& q- t7 q! {
o[c.#mGet," ",c.#B.#mGet," ",c.#B.#A.#mGet,"\r\n"],
/ s: j7 N+ ?+ U9 r
b=c.#B, a=b.#A, //获得基类对象
- S' X9 T/ k" C+ v5 N3 {
o[c.#mGet," ",b.#mGet," ",a.#mGet,"\r\n"];
复制代码
结果:
2 C% |5 ]9 O! i* l1 ?
+ U5 O1 W/ U+ p2 p1 ]
3 2 1
8 A) C# R: K L' L$ |+ `6 H
3 2 1
$ S, @' K: r- T
3 l3 p \+ n' q9 H0 |3 H# n% M7 B
(8)效率测试
!!!using("sys");
1 O7 [% O8 {/ X, f6 O6 c' ~
main(:a,i,t0,sum)=
& L. h% S/ B6 d' e/ i0 k
a=class{#A,
" K' ~- o* y4 x- R0 p
public:
w% d' M" A6 R
#January,
3 n4 u, p$ [4 R; f9 G+ ?
#February,
7 B6 L: b U6 N+ \! n
#March,
3 h6 u) U# g, X C& F
#April,
. o* K/ M( E6 b$ e; U$ N
#May,
4 d' @$ ^2 s. d/ _" J' L
#June,
$ [1 a7 r( e2 z$ w# y8 N
#July,
" m+ {, d# ]+ O) ~2 `3 L
#August,
/ X# k& @' d3 d# ] N- b
#September,
0 U4 [ i( c& u1 g: Z1 h
#October,
- W) ^: @( I0 d3 D$ s5 D
#November,
: \6 h$ S% e' l/ o2 r9 S& M
#December
- U5 b& ^: v" [! f3 ~& _
}.obj[],
! f0 @! v2 ?: X' t
t0=clock(), sum=0,
8 k" ^$ {6 i: o
i=0, while{++i<=100000,
- v+ b- b/ l2 B" R/ }9 Q
a.#January=1,
7 T. M7 G4 r( U/ [. w
a.#February=2,
. k6 Y; D: h; m
a.#March=3,
( P v# b- [# w4 A, @, ?5 a
a.#April=4,
8 x1 Z$ }( E2 A# a+ @3 O
a.#May=5,
8 y& E. T8 Z! | H, {
a.#June=6,
: M% ` l M# K3 M8 Y+ E4 z
a.#July=7,
8 P! f; H) h1 i! v
a.#August=8,
# i! _! l4 w- B1 W# f" x
a.#September=9,
# S/ l/ ~: `4 R2 Q* D3 k( @9 x' j
a.#October=10,
( M1 k0 X2 ~4 T% z$ V# J
a.#November=11,
1 s2 A* J$ o. @
a.#December=12,
( H0 Y3 M& t: h& x7 Q% H
sum=sum+a.#January+a.#February+a.#March+a.#April+a.#May+a.#June+a.#July+a.#August+a.#September+a.#October+a.#November+a.#December
. T" D- U% v( f) ~8 e
},
; F3 J2 H4 g J# {) M8 L$ i; ?
o{"\r\n耗时", [clock()-t0]/1000., "秒。sum=", sum, "\r\n"};
复制代码
结果:
耗时0.85999999999999999秒。sum=7800000
复制代码
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5