漫谈C#编程中的多态与new关键字

漫谈C#编程中的多态与new关键字,第1张

漫谈C#编程中的多态与new关键字,第2张

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的设计者没有“守约”。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » 漫谈C#编程中的多态与new关键字

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情