C#进阶(六)

大家好,我是武汉华师的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() {}
  }
  好了,这一节又完了,音乐还没完,但是我真的要休息了,明天见!
   
作者: SUNWEN  来自:网络
 感谢原创者的辛勤劳动,希望对您有所帮助,转载请注明原出处。
 警告:持续变种木马正在发起农历新年攻势!
 您可能对 [C#] 的这些文章也感兴趣:
论C#变得越来越臃肿是不可避免的
查询IP所在区段(C#)
在C#中利用SharpZipLib进行文件的压缩和解压缩
C# - Append a host header by code in IIS
在C#中调用Microsoft.VisualBasic命名空间下的类型验证函数
使用泛型实现单例提供者(原创翻译)
C#2 anonymous methods
Master Pages: Tips, Tricks, and Traps
Microsoft .NET 框架资源基础
基于.Net平台应用程序唯一运行实例实现
.net Framework 2.0 专门提供了配置文件的操作
正确实现 IDisposable