从接触计算机程序已有几年的光景了,真正使用C#是在半年前,说实话,对于面向对象的一些知识尚知之甚少,用到的时候总是感觉拿不准,或者看过一次,以后很少用,又忘记了,今天借此空闲机会将C#中的继承、隐藏与重写整理出来,也是注册CSDN以来第一篇小文吧,如有不足之处,还望批评指正!
先看一个简单的继承例子:
public class Person
{
protected string name;
public Person(string name)
{
this.name = name;
}
public void DiscribeYourself()
{
Console.WriteLine("my name is {0} i am a person",name);
}
}
public class Student:Person
{
public Student(string name)
: base(name)
{ }
public void DiscribeYourself()
{
Console.WriteLine("my name is {0}i am a student",name);
}
}
在主函数中如下调用的:
Person dev = new Person("dev");//自然调用本类构造函数
dev.DiscribeYourself();//调用本类方法
Person Car = new Student("car");//这个就像是父亲生了儿子,还是要调用父类的方法,使用声明类(即 Person类的方法)Car存储了Person的引用,它没有看student对此方法新的实现。使用初始声明为Person 的对象,即使给它赋一个student对象,也看不到派生类的new 方法。
Car.DiscribeYourself();输出Car是一个Person
Student mary = new Student("mary");
mary.DiscribeYourself();//在这里子类隐藏了父类的方法,调用了Student类的方法,这样和在Student类的DiscribeYourself前加上new关键字是一样的,这便是继承中的隐藏。
如果是如下调用:dev=mary; dev.DiscribeYourself(); 则调用了Person类的DiscribeYourself()方法;
如果是父类是虚函数那就不一样了,看下面的例子:
public class Person
{
protected string name;
public Person(string name)
{
this.name = name;
}
public virtual void DiscribeYourself() //为了在派生类中重写此方法,所以声明为virtual的
{
Console.WriteLine("my name is {0} i am a person",name);
}
}
public class Student:Person
{
public Student(string name)
: base(name)
{ }
public override void DiscribeYourself()//当生成该类对象时,它是最初的实现,所以它覆盖了父类的同名方法
{
Console.WriteLine("my name is {0} i am a student",name);
}
}
调方法如上例,而Car对象得出的结果却是不同的:my name is car i am a student
把基类写成virtual的,说明派生类可以重写基类里面,名称相同,签名相同的方法。用override关键字修饰派生类的方法,以达到写,当然重写不是必须的,可以重写,也可以不重写,依个人情况而定;在上例中,派生类重写了基类的方法,即使Car 声明为Person的,它仍然是一个student。这是因为基类方法是virtual的,派生了使用override重写了,编译时产生代码,进行运行检测,查找它的最初实现(即类的方法),即使把它声明为基类,还是执行检测到的代码。相反,如果不是重写,则在程序编译时已经定了,声明为哪个类的就调用哪个类的方法。new 关键字只是说明了派生类中有与基类同名,同签名的方法,在派生中产生一个新的方法,与基类无关。
好了,这篇小文就写到这吧!