![]() ![]() |
|
漫谈C#编程中的多态与new关键字 | |
作者:佚名 文章来源:不详 点击数 更新时间:2008/3/25 21:30:55 文章录入:杜斌 责任编辑:杜斌 | |
|
|
假设我有一个类,里面有一个 PrintStatus 方法,用于打印实例的当前状态,我希望该类的派生类都带有一个 PrintStatus 方法,并且这些方法都用于打印其实例的当前状态。那么我会这样表达我的愿望: // Code #01 class Base { public virtual void PrintStatus() { Console.WriteLine("public virtual void PrintStatus() in Base"); } } 于是我可以写一个这样的方法: // Code #02 public void DisplayStatusOf(Base[] bs) { foreach (Base b in bs) { b.PrintStatus(); } } bs 中可能包含着不同的 Base 的派生类,但我们却可以忽略这些“个性”而使用一种统一的方式来处理某事。在 .net 2.0 中,XMLReader 的 Create 有这样一个版本: public static XMLReader Create(Stream input); 你可以向 Create 传递任何可用的“流”,例如来自文件的“流”(FileStream)、来自内存的“流”(MemoryStream)或来自网络的“流”(NetworkStream)等。虽然每一中“流”的工作细节都不同,但我们却使用一种统一的方式来处理这些“流”。 2. 假如有人不遵守承诺... DisplayStatusOf 隐含着这样一个假设:bs 中如果存在派生类的实例,那么该派生类应该重写 PrintStatus,当然必须加上 override 关键字: // Code #03 class Derived1 : Base { public override void PrintStatus() { Console.WriteLine("public override void PrintStatus() in Derived1"); } } 你可以把这看作一种承诺、约定,直到有人沉不住气... // Code #04 class Derived2 : Base { public new void PrintStatus() { Console.WriteLine("public new void PrintStatus() in Derived2"); } } 假设我们有这样一个数组: // Code #05 Base[] bs = new Base[] { new Base(), new Derived1(), new Derived2() }; 把它传递给 DisplayStatusOf,则输出是: // Output #01 // public virtual void PrintStatus() in Base // public override void PrintStatus() in Derived1 // public virtual void PrintStatus() in Base 从输出结果中很容易看出 Derived2 并没有按照我们期望的去做。但你无需惊讶,这是由于 Derived2 的设计者没有“遵守约定”的缘故。 |
|
![]() ![]() |