Spiga
Posts - 175, Articles - 14, Comments - 2601
Cnblogs
Dashboard
Login
Home
Contact
Gallery
RSS
Cat in dotNET
函数重载库Overload
2009-07-02 14:24 by Cat Chen, 242 visits,
收藏
,
编辑
(
function
()
{
Overload
=
{}
;
var
copySignature
=
function
(signature)
{
var
copy
=
[];
for
(
var
i
=
0
; i
<
signature.length; i
++
)
{
copy.push(signature[i]);
}
if
(signature.arguments)
{
copy.arguments
=
true
;
}
return
copy;
}
;
var
inheritanceComparator
=
function
(type1, type2)
{
if
(type1
==
type2)
{
return
0
;
}
else
if
(type2
==
Overload.Any)
{
return
1
;
}
else
if
(type1
==
Overload.Any)
{
return
-
1
;
}
else
if
(type1.prototype
instanceof
type2)
{
return
1
;
}
else
if
(type2.prototype
instanceof
type1)
{
return
-
1
;
}
else
{
return
0
;
}
}
;
var
overloadComparator
=
function
(overload1, overload2)
{
var
signature1Better
=
false
;
var
signature2Better
=
false
;
var
signature1
=
overload1.signature;
var
signature2
=
overload2.signature;
if
(
!
signature1.more
&&
signature2.more)
{
signature1Better
=
true
;
signature1
=
copySignature(signature1);
signature1.length
=
signature2.length;
}
else
if
(signature1.more
&&
!
signature2.more)
{
signature2Better
=
true
;
signature2
=
copySignature(signature2);
signature2.length
=
signature1.length;
}
else
if
(signature1.more
&&
signature2.more)
{
if
(signature1.length
>
signature2.length)
{
signature2
=
copySignature(signature2);
while
(signature2.length
<
signature1.length)
{
signature2[signature2.length]
=
Overload.Any;
}
}
else
if
(signature1.length
<
signature2.length)
{
signature1
=
copySignature(signature1);
while
(signature1.length
<
signature2.length)
{
signature1[signature1.length]
=
Overload.Any;
}
}
}
for
(
var
i
=
0
; i
<
signature1.length; i
++
)
{
var
comparison
=
inheritanceComparator(signature1[i], signature2[i]);
if
(comparison
>
0
)
{
signature1Better
=
true
;
}
else
if
(comparison
<
0
)
{
signature2Better
=
true
;
}
}
if
(signature1Better
&&
!
signature2Better)
{
return
1
;
}
else
if
(
!
signature1Better
&&
signature2Better)
{
return
-
1
;
}
else
{
return
0
;
}
}
;
var
matchSignature
=
function
(argumentsArray, signature)
{
if
(argumentsArray.length
<
signature.length)
{
return
false
;
}
else
if
(argumentsArray.length
>
signature.length
&&
!
signature.more)
{
return
false
;
}
for
(
var
i
=
0
; i
<
signature.length; i
++
)
{
if
(
!
(signature[i]
==
Overload.Any
||
argumentsArray[i]
instanceof
signature[i]
||
argumentsArray[i].constructor
==
signature[i]))
{
return
false
;
}
}
return
true
;
}
;
Overload.create
=
function
(overloadsArray)
{
var
overloads
=
[];
var
select
=
function
(argumentsArray)
{
var
matches
=
[];
for
(
var
i
=
0
; i
<
overloads.length; i
++
)
{
if
(matchSignature(argumentsArray, overloads[i].signature))
{
matches.push(overloads[i]);
}
}
switch
(matches.length)
{
case
0
:
return
null
;
case
1
:
return
matches[
0
][
"
function
"
];
default
:
matches
=
matches.sort(overloadComparator);
if
(overloadComparator(matches[matches.length
-
1
], matches[matches.length
-
2
])
>
0
)
{
return
matches[matches.length
-
1
][
"
function
"
];
}
else
{
return
null
;
}
}
}
;
var
overloaded
=
function
()
{
var
overload
=
select(arguments);
if
(overload)
{
return
overload.apply(
this
, arguments);
}
else
{
throw
"
cannot select a proper overload
"
;
}
}
;
overloaded.select
=
select;
overloaded.add
=
function
(signature, overload)
{
if
(signature
instanceof
Array)
{
signature
=
copySignature(signature);
}
else
if
(signature.constructor
==
String)
{
if
(signature.replace(
/
(^\s+|\s+$)
/
ig,
""
)
==
""
)
{
signature
=
[];
}
else
{
signature
=
signature.split(
"
,
"
);
for
(
var
i
=
0
; i
<
signature.length; i
++
)
{
var
typeExpression
=
signature[i].replace(
/
(^\s+|\s+$)
/
ig,
""
);
var
type
=
null
;
if
(typeExpression
==
"
*
"
)
{
type
=
Overload.Any;
}
else
if
(typeExpression
==
"
...
"
)
{
type
=
Overload.More;
}
else
{
try
{
type
=
eval(
"
(
"
+
typeExpression
+
"
)
"
);
}
catch
(error)
{
throw
"
type expression cannot be evaluated:
"
+
typeExpression;
}
}
signature[i]
=
type;
}
}
}
else
{
throw
"
signature is neither a string nor an array
"
;
}
for
(
var
i
=
0
; i
<
signature.length; i
++
)
{
if
(
!
(signature[i]
instanceof
Function))
{
throw
"
argument type should be a function
"
;
}
if
(i
<
signature.length
-
1
&&
signature[i]
==
Overload.More)
{
throw
"
arguments type cannot be used in any argument except the last one
"
;
}
}
if
(signature[signature.length
-
1
]
==
Overload.More)
{
signature.length
=
signature.length
-
1
;
signature.more
=
true
;
}
overloads.push(
{
"
signature
"
: signature,
"
function
"
: overload
}
);
return
this
;
}
;
return
overloaded;
}
;
Overload.add
=
function
(signature, overload)
{
return
Overload.create().add(signature, overload);
}
;
Overload.Any
=
function
any()
{
throw
"
this type is only an identifier and should not be instantiated
"
}
;
Overload.More
=
function
more()
{
throw
"
this type is only an identifier and should not be instantiated
"
}
;
}
)();
绿色通道:
好文要顶
关注我
收藏该文
与我联系
注册用户登录后才能发表评论,请
登录
或
注册
,
返回博客园首页
。
首页
博问
闪存
新闻
园子
招聘
知识库
最新IT新闻
:
·
Chrome将给老机带来更快的3D绘图性能
·
在线支付创业公司Stripe获红杉资本等1800万美元的投资,公司估值达1亿美元
·
创新工场孵化公司磊友科技今天正式推出首款大型手机HTML5网页游戏《黎明帝国》
·
霍金的伟大与不幸
·
Linux为什么成功?因为它的失败是免费的!
»
更多新闻...
最新知识库文章
:
·
高级编程语言的发展历程
·
如何学习一门新的编程语言?
·
学习不同编程语言的重要性
·
为什么我喜欢富于表达性的编程语言
·
计算机专业的女生为什么要学编程
»
更多知识库文章...
China-pub 2011秋季教材巡展
China-Pub 计算机绝版图书按需印刷服务
About
我的链接
我的标识
我的简历与作品
@CatChen
Cat in Chinese
Cat in English
Cat on Web Tech
订阅
版权许可
This work is licensed under a
Creative Commons License
.
昵称:
Cat Chen
园龄:
5年3个月
粉丝:
131
关注:
0
随笔分类
Rss
*Book Recommendation*(3)
Rss
*Comprehensive Understanding*(9)
Rss
*Most Practical*(9)
Rss
*Netcasts*(2)
Rss
*Random Clippings*(10)
Rss
*Resources*(8)
Rss
.NET Framework(14)
Rss
AJAX(46)
Rss
ASP.NET(68)
Rss
ASP.NET AJAX(24)
Rss
ASP.NET Futures(8)
Rss
C#(7)
Rss
CSS(14)
Rss
IE(2)
Rss
iPhone(8)
Rss
JavaScript(55)
Rss
LINQ(1)
Rss
Linq to Sql(2)
Rss
Linq to Xml(1)
Rss
Mac(1)
Rss
Node.js(1)
Rss
Rails(4)
Rss
Ruby(4)
Rss
Silverlight(7)
Rss
SQL(4)
Rss
Web(113)
Rss
WF(1)
Rss
Windows(1)
Rss
WPF(1)
Rss
XNA(1)
随笔档案
2012年1月(2)
2011年12月(3)
2011年8月(1)
2011年7月(1)
2011年5月(1)
2010年12月(2)
2010年11月(5)
2010年7月(3)
2010年5月(1)
2010年3月(1)
2010年2月(3)
2010年1月(1)
更多...
2009年12月(4)
2009年11月(5)
2009年10月(3)
2009年9月(1)
2009年8月(2)
2009年7月(3)
2009年6月(4)
2009年5月(4)
2009年4月(1)
2009年3月(2)
2008年12月(3)
2008年11月(2)
2008年10月(2)
2008年9月(2)
2008年4月(2)
2008年3月(5)
2008年2月(1)
2008年1月(7)
2007年12月(6)
2007年11月(4)
2007年10月(4)
2007年9月(1)
2007年8月(2)
2007年7月(3)
2007年6月(4)
2007年5月(4)
2007年4月(1)
2007年3月(5)
2007年2月(7)
2007年1月(3)
2006年12月(13)
2006年11月(11)
2006年10月(30)
推荐排行榜
阅读排行榜
我的链接
Rss
Cat in Chinese
Rss
Cat in English
我的标识
我的简历与作品