|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。标准|把持 版本把持是一个历程,它以兼容的体例对组件举行不休的改善。假如依附于初期版本的代码从头编译后能够合用于新版本,则组件的新版本与初期版根源代码兼容。相反,假如依附于初期版本的使用程序不必从头编译便可合用于新版本,则组件的新版本为二进制兼容。
年夜多半言语基本不撑持二进制兼容性,并且很多言语对增进源代码兼容性所做甚少。实践上,某些言语所含的缺点使得用它开辟出来的组件在不休的改善过程当中,一样平常最少会使依附于该组件的某些客户端代码生效。
比方,请看一个公布名为Base的类的基类作者的情形。在第一个版本中,Base不包括任何F办法。名为Derived的组件从Base派生,并引进F。此Derived类与它所依附的Base类一同公布给客户,客户又部署到浩瀚客户端和服务器。
//AuthorA
namespaceA
{
publicclassBase//version1
{
}
}
//AuthorB
namespaceB
{
classDerived:A.Base
{
publicvirtualvoidF(){
System.Console.WriteLine("Derived.F");
}
}
}
从这时候起,入手下手发生版本成绩。Base的作者天生了一个具有本人的F办法的新版本。
//AuthorA
namespaceA
{
publicclassBase//version2
{
publicvirtualvoidF(){//addedinversion2
System.Console.WriteLine("Base.F");
}
}
}
这个新版本的Base在源代码和二进制方面都应当与初始版本兼容。(假如仅增加一个新的办法就会产兼容性成绩,则基类大概就永久不克不及改善了。)不幸的是,Base中的新F使Derived的F的寄义不清。Derived是指重写Base的F吗?这看上往不太大概,由于编译Derived时,Base还没有F!别的,假如Derived的F切实其实是重写了Base的F,则它必需恪守由Base指定的协议(此协议在编写Derived时髦未指定)!在某些情形下,这是不成能的。比方,Base的F大概请求它的重写一直挪用基办法。Derived的F不成能恪守如许的协议。
C#经由过程请求开辟职员明白声明它们的企图来办理此版本成绩。在原始的代码示例中,代码很分明,由于Base乃至没有F。很分明,因为不存在名为F的基办法,因而Derived的F是一个新办法而不是对基办法的一个重写。
假如Base增加F并公布新版本,则在Derived的二进制版本中对“Derived的F”是甚么仍很分明:它语义上与重写有关,不该将它视为重写。
但是,当从头编译Derived时,其寄义还是不分明的:Derived的作者大概盘算让它的F重写Base的F大概埋没它。因为企图不清,编译器天生一个告诫,并在默许情形下使Derived的F埋没Base的F。此编译历程形成了语义上的二义性(与从头编译Derived前比拟较)。天生的告诫提示Derived的作者Base中存在F办法。
假如Derived的F在语义上与Base的F有关,则Derived的作者能够经由过程在F的声明中利用new关头字来暗示此企图(而且无效地封闭告诫)。
//AuthorA
namespaceA
{
publicclassBase//version2
{
publicvirtualvoidF(){//addedinversion2
System.Console.WriteLine("Base.F");
}
}
}
//AuthorB
namespaceB
{
classDerived:A.Base//version2a:new
{
newpublicvirtualvoidF(){
System.Console.WriteLine("Derived.F");
}
}
}
另外一方面,Derived的作者经由进一步思索,大概决意Derived的F应重写Base的F。能够经由过程利用override关头字来指定此企图,以下所示。
//AuthorA
namespaceA
{
publicclassBase//version2
{
publicvirtualvoidF(){//addedinversion2
System.Console.WriteLine("Base.F");
}
}
}
//AuthorB
namespaceB
{
classDerived:A.Base//version2b:override
{
publicoverridevoidF(){
base.F();
System.Console.WriteLine("Derived.F");
}
}
}
Derived的作者另有另外一种选择,就是变动F的称号,从而完全制止称号抵触。只管此变动会损坏Derived的源代码和二进制兼容性,但这类兼容性的主要性因计划而异。假如不向其他程序公然Derived,则变动F的称号极可能是个好主张,由于这会进步程序的可读性,就是说F的寄义不会再有任何搅浑。
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的) |
|