[erlang] Erlang继承(inheritance)
FROM: http://www.erlang.se/euc/07/papers/1700Carlsson.pdf
alpha.erl
1 -module(alpha,[X,Y]). 2 -export([a/0,b/1,c/2]). 3 4 a() -> 5 {?MODULE,a,[X,Y],[]}. 6 7 b(S) -> 8 {?MODULE,b,[X,Y],[S]}. 9 10 c(S,T) -> 11 {?MODULE,c,[X,Y],[S,T]}.
运行结果:
Eshell V5.8.4 (abort with ^G) 1> c(alpha). {ok,alpha} 2> A = alpha:new(x,y). {alpha,x,y} 3> A:a(). {alpha,a,[x,y],[]} 4> A:b(1). {alpha,b,[x,y],[1]} 5> A:c(1,2). {alpha,c,[x,y],[1,2]} 6>
beta.erl
1 -module(beta,[X,Y]). 2 -extends(alpha). 3 4 -export([a/0,b/1]). 5 6 a() -> 7 {?MODULE,?BASE_MODULE,a,[X,Y],[]}. 8 9 b(S) -> 10 {?MODULE,?BASE_MODULE,b,[X,Y],[S]}.
运行结果:
Eshell V5.8.4 (abort with ^G) 1> c(beta). {ok,beta} 2> B = beta:new(x,y). {beta,x,y} 3> B:a(). {beta,alpha,a,[x,y],[]} 4> B:b(1). {beta,alpha,b,[x,y],[1]} 5> B:c(1,2). {alpha,c,[x,y],[1,2]} 6>
gamma.erl
1 -module(gamma,[X,Y]). 2 -extends(beta). 3 4 -export([a/0,new/1]). 5 6 %% 重写构造方法 7 new(Z) -> 8 B = ?BASE_MODULE:new(Z,17), 9 instance(B,Z,42). 10 11 a() -> 12 {?MODULE,?BASE_MODULE,a,[X,Y],[]}.
运行结果 (注1)
Eshell V5.8.4 (abort with ^G) 1> c(gamma). {ok,gamma} 2> G = gamma:new(z). {gamma,z,17} 3> G:a() {gamma,beta, a, [z,42], []} 4> G:b(1) {beta,alpha, b, [z,17], [1]} 5> G:c(1,2) {alpha, c,[z,17], [1,2]}
注1 这个本地没有跑通,可能是erlang版本问题
PS: 只是erlang的一些语法糖,OOP对于系统语言是增加复杂度了
think in coding