[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对于系统语言是增加复杂度了

 

 

 

posted on 2012-05-17 16:38  bluefrog  阅读(854)  评论(1编辑  收藏  举报