Spiga
Posts - 155, Articles - 13, Comments - 2332
Cnblogs
Dashboard
Login
Home
Contact
Gallery
RSS
Cat in dotNET
函数重载库Overload
2009-07-02 14:24 by Cat Chen, 127 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
"
}
;
}
)();
0
0
0
(请您对文章做出评价)
«
上一篇:
让 JavaScript 轻松支持函数重载 (Part 1 - 设计)
»
下一篇:
让 JavaScript 轻松支持函数重载 (Part 2 - 实现)
注册用户登录后才能发表评论,请
登录
或
注册
。
IT新闻
:
·
阿里巴巴3月推1688网络批发 胡戈韩寒出力宣传
·
第一代互联网拓荒者再掀连环创业潮
·
雅虎将永久性关闭科技站点Yahoo! Tech
·
知名扩展 Firebug 的简化版登陆 Chrome
·
Google 悄悄地启用 1e100.net,打枪地不要
每天10分钟,轻松学英语
专题:
iPad
jQuery
Windows 7
网站导航:
博客园首页
IT新闻
个人主页
闪存
程序员招聘
社区
博问
网摘
China-pub 计算机图书网上专卖店!6.5万品种2-8折!
China-Pub 计算机绝版图书按需印刷服务
在知识库中查看:
函数重载库Overload
About
我的链接
我的标识
我的简历与作品
Cat in Chinese
Cat in English
Cat on Web Tech
订阅
版权许可
This work is licensed under a
Creative Commons License
.
我的主页
个人资料
我的闪存
发短消息
随笔分类
Rss
*Book Recommendation*(1)
Rss
*Comprehensive Understanding*(9)
Rss
*Most Practical*(9)
Rss
*Netcasts*(2)
Rss
*Random Clippings*(10)
Rss
*Resources*(4)
Rss
.NET Framework(14)
Rss
AJAX(45)
Rss
ASP.NET(68)
Rss
ASP.NET AJAX(24)
Rss
ASP.NET Futures(8)
Rss
C#(7)
Rss
CSS(14)
Rss
iPhone(8)
Rss
JavaScript(44)
Rss
LINQ(1)
Rss
Linq to Sql(2)
Rss
Linq to Xml(1)
Rss
Mac(1)
Rss
Rails(4)
Rss
Ruby(4)
Rss
Silverlight(7)
Rss
SQL(4)
Rss
Web(108)
Rss
WF(1)
Rss
Windows(1)
Rss
WPF(1)
Rss
XNA(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)
我管理的小组
iPhone / iPad 开发
团队博客
.NET 控件与组件开发(0/0)
北京.NET俱乐部(0/0)
应届毕业生之家(0/0)
广州.NET俱乐部(0/0)
Ajax&Atlas技术团队(0/0)
ASP.NET AJAX (Atlas)学习(0/0)
.NetFramework3.0 & 3.5(WCF,WPF,WF)团队(0/0)
MVP(微软最有价值专家)团队(0/0)
Silverlight学习与研究(0/0)
Windows Vista开发(0/0)
数据库团队(0/0)
.net企业应用开发(0/0)
MVP播客(0/0)
asp.net开发团队(0/0)
RIA技术联盟(0/0)
60天内阅读排行
程序员的品味(3605)
程序之外的事情 (Part 1 - Speech)(2977)
《程序员羊皮卷》书评(2741)
看对的书 (Part 0 - 何谓对错)(2235)
China MVP Open Day 2009(2102)
能承载移动 Web 应用的唯一浏览器: Mobile Safari(1824)
欢迎加入 iPhone / iPad 开发小组(1502)
Apple 谈论产品 vs Microsoft 谈论技术(1484)
阅读排行榜
根本不存在 DIV + CSS 布局这回事(29860)
欲练 CSS ,必先宫 IE(14419)
你有 <table /> 强迫症吗?(9647)
IIS7 会重用那些不该重用 HttpHandler(9041)
Code is Configuration(8966)
英语阅读推荐:基于AJAX的ASP.NET聊天室 & 如何建立共识(8585)
什么样的 Code 更像是 Configuration(8321)
英语阅读推荐:美化文件上传框 & 无刷新文件上传(8055)
英语阅读推荐:使用AJAX+WF+LINQ制作Google IG式首页(7599)
十分钟内学会:将HTML格式化为合法的XML(7591)
我的链接
Rss
Cat in Chinese
Rss
Cat in English
我的标识
我的简历与作品