欢迎光临
我们一直在努力

SUNWEN教程之—-C#进阶6-.NET教程,C#语言

建站超值云服务器,限时71元/月

sunwen教程之—-c#进阶
(六)
mrfat@china.com  
大家好,我是武汉华师的sunwen.现在是五月二号晚上19:27,由于闲着没事干,所有又写起来了.昨天照了十几张相,待会可以去取了,不知照片中的我是不是很帅,呵呵!现在我耳边正听着2000欧洲杯的曲子,所以比较激动.唉,身为我们院2000级足球队长的我,已经很久没有踢球了!

现在我要说的是c#中的版本处理.其实这是任何一个软件必须要考虑的问题.每个软件都不只一个版本(除了我写的以外),因此版本处理显得非常地重要.java很好地处理了这个问题,而我个人认为c#借鉴了java的处理方法,所以,也做得很好.

在c#中,如果你在声明一个方法的时候用了virtual这个关键字,那么,在派生类中,你就可以使用override或者new关键字来弃用它或是忽略它.如果你在父类中用了virtual这个关键字,而在其派生类中又没有用override或new关键字,而直接引用一个同名方法的话,编译器将会报错,并将以new方式,即忽略派生类中的方法的方式来运行.下面的例子可以帮助你来理解:

000: // versioning\versioning.cs
001: public class mybase
002: {
003:     public virtual string meth1()
004:     {
005:         return "mybase-meth1";
006:     }
007:     public virtual string meth2()
008:     {
009:         return "mybase-meth2";
010:     }
011:     public virtual string meth3()
012:     {
013:         return "mybase-meth3";
014:     }
015: }
016:
017: class myderived : mybase
018: {
019:     public override string meth1()
020:     {
021:         return "myderived-meth1";
022:     }
023:     public new string meth2()
024:     {
025:         return "myderived-meth2";
026:     }
027:     public string meth3() // 系统在这里将会有一个警告,并且将会隐藏方法meth3()
028:                           
029:                           
030:     {
031:         return "myderived-meth3";
032:     }
033:
034:     public static void main()
035:     {
036:         myderived md = new myderived();
037:         mybase mb = (mybase) md;
038:
039:         system.console.writeline(mb.meth1());
040:         system.console.writeline(mb.meth2());
041:         system.console.writeline(mb.meth3());
042:     }
043: }

输出:

myderived-meth1
mybase-meth2
mybase-meth3
可以很明显地看出来,后两个new关键字的输出是父类中的方法的输出,所以可以看出,new这个关键字的作用是如果在以前的版本中有这个方法,就沿用以前的方法,而不用我现在方法内容.而virtual的方法的作用正好相反,它的作用是如果在父类中有这样一个方法,则用我现在写的方法内容,让以前的滚蛋!不过,这里用new好象不太好,让人误解(糟了,盖痴又要打我了!&*%$#@).

如果你把第037行去掉,把039-041中的mb全部改为md,输出又变为:

myderived-meth1
myderived-meth2
myderived-meth3

这又说明了什么呢,说明了派生类的对象只有在被父类重塑的时候,override和new关键字才会生效.呵呵,这样说的确有点难以理解,大家只有自己动手,才能搞清楚这其中的机关,所谓"实践是检验c#的唯一标准",哈哈!

在c#中,你可以自由地为在派生类中为加入一个方法,或者覆盖父类的方法,如下所示,非常地简单:

class base {}
class derived: base
{
   public void f() {}
}
和:

class base
{
   public void f() {}
}
class derived: base
{
   public void f() {}
}
好了,这一节又完了,音乐还没完,但是我真的要休息了,明天见!

下一页

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » SUNWEN教程之—-C#进阶6-.NET教程,C#语言
分享到: 更多 (0)