漫谈C#编程中的多态与new关键字
1.通常如何使用多态性?
假设我有一个包含PrintStatus方法的类,它用于打印实例的当前状态。我希望这个类的所有派生类都有一个PrintStatus方法,所有这些方法都用来打印其实例的当前状态。那我就这样表达我的愿望:
//代码#01
class Base
{
public virtual void print status()
{
Console。WriteLine(" Base中的public virtual void print status());
}
}
所以我可以写一个这样的方法:
//代码#02
public void display status of(Base[]bs)
{
foreach(Base b in bs)
{
b . print status();
}
}
Bs可能包含不同的Base的派生类,但是我们可以忽略这些“个性”,用统一的方式来处理一些事情。英寸net 2.0,创建的XMLReader有这样一个版本:
公共静态XMLReader Create(流输入);
您可以传递任何可用的“流”来创建,例如FileStream、MemoryStream或NetworkStream。虽然每个“流”的工作细节不同,但是我们用统一的方式来处理这些“流”。
2.如果有人不遵守...
DisplayStatusOf暗示了这样一个假设,如果bs中有一个派生类的实例,那么派生类应该重写PrintStatus,当然必须添加override关键字:
//代码#03
class derived 1:Base
{
public override void print status()
{
Console。WriteLine(" derived 1中的public override void print status());
}
}
你可以把这当成一种约定,直到有人不耐烦为止。...
//代码#04
class derived 2:Base
{
public new void print status()
{
Console。WriteLine(" derived 2中的public new void print status());
}
}
假设我们有这样一个数组:// Code #05
Base[]bs = new Base[]
{
new Base(),
new Derived1(),
new derived 2()
};
将其传递给DisplayStatusOf,输出为:
//输出#01
//基底中的public virtual void PrintStatus()
//衍生1中的public override void print status()
//基底中的public virtual void print status()
从输出中很容易看出,Derived2没有达到我们的预期。但你不需要感到惊讶。这是因为Derived2的设计者没有“守约”。
位律师回复
0条评论