C#进阶教程(六)

原创 2007年09月29日 08:43:00
 

c#中的版本处理
  现在我要说的是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() {}
}

C#基础教程-委托进阶,将方法绑定到委托

将方法绑定到委托   看到这里,是不是有那么点如梦初醒的感觉?于是,你是不是在想:在上面的例子中,我不一定要直接在GreetPeople()方法中给 name参数赋值,我可以像这样使用变量: ...
  • neso520
  • neso520
  • 2011年08月05日 14:54
  • 404

ReportStudio进阶教程(三十二) - 地图开发(六)修改Cognos地图文件

本文章参考了一篇教程,从网上找的word文档,暂无作者,感谢分享 文档下载地址: --------------------------------------- 在前面的练习中,我们会发现一个问...

Android高手进阶教程(六)----Android中MenuInflater的使用!

大家好,我们上一节讲的是LayoutInflater的 使用,而这一节我将讲一下MenuInflater,顾名思义,LayoutInflater是用来解析定义在layout下的布局文件,那么MenuI...

Python Django进阶教程(六)(缓存机制,CSRF)

Django版本:1.11 操作系统:Windows Python:3.5Django的缓存的缓存有几种类型: Memcached的 数据库缓存 文件系统缓存 本地内存缓存 个人首选排序:M...

Android高手进阶教程(六)之----Android 中MenuInflater的使用(布局定义菜单)!

2010-04-23 21:11:25 标签:Android教程 Android 移动开发 MenuInflater 休闲 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者...

D3D11进阶教程六之四叉树(QuadTree)

本节教程是关于

X-Space系列进阶教程六之实时视频传输原理

今天我们给大家讲讲我们的视频传输的原理,也就是对Mjpg_Stream进行源码分析,我将给大家按照我之前发表的论文里面的内容给大家进行讲解,当然力求为了让大家可以更简单的了解到实时视频传输的原理呢,我...

Android高手进阶教程(六)之----Android 中MenuInflater的使用(布局定义菜单)!

大家好,我们上一节讲的是LayoutInflater 的 使用,而这一节我将讲一下MenuInflater ,顾名思义,LayoutInflater 是用来解析定义在layout 下的布局文件,那么M...
  • logo616
  • logo616
  • 2011年11月03日 11:07
  • 282
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#进阶教程(六)
举报原因:
原因补充:

(最多只允许输入30个字)