C#中普通函数重写
前⾔
在⾯向对象程序设计中,多态是⾮常重要的⼀个特性。多态能够实现同⼀基类的不同的类中重写的同名虚函数的不同功能表现。⽽在对这个基类的函数重写以后,原函数就不存在了,取⽽代之的是新的重写后的函数。⽐如,在C#的某个基类中有个虚函数:
public virtual void Say(){ print("base"); }
⽽在此类的派⽣类中,如果对Say()⽅法重写如下:
public void Say(){ print("Overrided Say()"); }
那么⽆论如何调⽤这个派⽣类的对象的Say()⽅法,返回的永远是 Overrided Say()。
问题描述
在某个场合,⽐如Tom写了⼀个基类Person,Jack写了⼀个继承于Person的Student类。在实现的过程中,Jack需要为Student类添加⼀个函数GetName(),但是却发现在Person类中,已经有同名函数存在,⽽这个同名函数⼜不是虚函数,所以⽆法重写。这时候应该如何解决?
解决办法
在C#提供了⼀个有意思的特性,就是为⼀个普通函数提供重写⽅法。下⾯请看⼀个⽰例。
基类:Person
public class Person
{
public string name {get;set;}
public string GetName()
{
return name;
}
}
派⽣类:Student
public class Student: Person
{
public string _name;
public new string GetName()
{
return"Student: "+ _name;
}
}
客户端使⽤码如下。
Person p = new Student() { name = "Tom" };
Console.WriteLine(p.GetName());
Console.WriteLine((p as Student).GetName());
输出结果:
Tom
Student: Tom
从这个输出来看,显然有2个GetName()⽅法,⼀个是与Person所有的,另⼀个是Student类所有的。这样以来,问题就解决了。不过在使⽤的时候,需要清楚不同的类所有的⽅法的使⽤。这种⽅法虽然能够解决问题,但是不推荐使⽤,因为这会让不同的函数在调⽤时让调⽤⼈员感到困扰,会有安全隐患。所以除⾮特殊情况,否则不推荐使⽤。还是以虚函数为主要实现⽅式。
总结
普通函数在C#中也可以进⾏重写,只是其重写⽅式与虚⽅法重写略有区别。⽐如,普通⽅法GetName()在基类和派⽣类中都有,⽽虚⽅法是共⽤⼀个。所以在调⽤时,以不同的级别(作为基类或派⽣类)调⽤时,就会有不同的结果。
另外,注意⼀点,如果不加new关键字,会有警告提⽰:“Student.GetName()”隐藏了继承的成员“Person.GetName()”。如果是有意隐藏,请使⽤关键字 new。经测试,⽬前的结论是,如果不加,系统会编译时按加了new关键字的情况来处理,即加不加都是⼀样的,不过不加系统会警告。可能加了以后⽐较清楚直观⼀点,⼀看就知道这是基类有的代码。
>writeline函数
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论