首页 > 应用开发 > IT综合 > 漫谈C#编程中的多态与new关键字之一(转)
// 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 的设计者没有“遵守约定”的缘故。
[@more@]来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/79548/viewspace-924677/ ,如需转载,请注明出处,否则将追究法律责任。