C#中子类重写父类方法的几种情况,关键字:virtual、abstract、override、new。(此处不说abstract,以后补充)
virtual:不是必须被子类重写的方法,父类必须给出实现,子类可以重写(使用override,new,或无特殊标志的普通方法),也可以不重写该方法。
new:重写父类方法时,父类可以使用virtual,override,new之一声明,也可以是没有关键字的普通方法,运行时会根据引用类型选择调用父类还是子类方法,重写父类方法时,使用new关键字与使用没有关键字的普通方法的等效的,但是后者会给出编译警告。
继承:
继承是派生类(子类)去实现(重写<override>、重构<new>)基类(父类)的方法或属性。从而获取在派生类中要实现的功能。
子类调用父类构造方法,在父类中有个实现姓名和年龄的构造方法但是子类中也要实现这样的功能时,子类不用再次去写这个功能,只要去调用父类的功能即可。
#region实现结果:
public class Person
{
private string _name ;
private int _age ;
public Person(string name, int age)//父类的构造方法
{
this._name = name;//获得参数的值
this._age = age;
Console.WriteLine("您的姓名是{0},您的年龄是{1}.",this._name, this._age);
}
}
public class Studnet : Person
{
private int _id;
public Studnet(string name, int age, int IDCard):base(name, age)//子类构造方法继承父类构造方
//把接受到的name、age两个参数交给父类的构造方法去处理
{
this._id = IDCard;
Console.WriteLine("您的身份证号码为{0}", this._id);
}
}
class Program
{
static void Main(string[] args)//主函数
{
Studnet stu = new Studnet("小王", 18, 340406);
Console.ReadLine();
}
}
#endregion
您的姓名是 小王,您的年龄是 18.
您的身份证号码为 340406
子类调用父类方法时,先执行父类的方法,再去执行子类的方法。
重写:
重写只是对方法里面的功能重新做了编写,并没有对方法的参数进行添加,改变,删除。重写是面向对象的概念
举例:重写Show方法
public class Person实现结果:
{
public virtual void Show(string name, string school, string Class)
{
Console.WriteLine("我在{0}学习",Class);
Console.WriteLine("我叫{0}.我毕业与{1}",name,school);
}
}
public class Studnet : Person
{
public override void Show(string name, string school, string Class) //重写了父类的ShowME方法
{
Console.WriteLine("姓名{0},毕业学校{1},曾读班级{2}",name,school,Class);
}
}
class Program
{
static void Main(string[] args)//主函数
{
Studnet stu = new Studnet();
stu.Show("小王","家里蹲大学","泡妹(1)班");
Console.ReadLine();
}
}
#endregion
姓名小王,毕业学校家里蹲大学曾读班级lol最强王者班 (没有运行父类中方法)
重写的父类方法时,必须指明被重写的方法是虚方法(virtual关键字)。在子类重写父类方法时必须有重写关键字(override)这样才能重写父类的方法
重载:
重载除了方法名不能被改变为另外什么都能重新定义(方法作用域、返回类型、方法体、方法参数) (当然也可以只改变部分内容比如只改变方法体,不改变参数)重载是面向过程的概念
重载Show方法
测试1:
#region 重载Show方法实现结果:
public class Person
{
public void Show()
{
Console.WriteLine("我是父类的方法");
}
}
public class Studnet : Person
{
public new void Show( )//此处不写new会出现编译提示,但是不算出错。
{
Console.WriteLine("我是子类的方法");
}
}
class Program
{
static void Main(string[] args)//主函数
{
Studnet stu = new Studnet();
stu.Show();
Console.ReadLine();
}
}
#endregion
我是子类方法 (没有运行父类中方法)
测试2:
#region 重载Show方法实现结果:
public class Person
{
public void Show(string name, string school, string Class)
{
Console.WriteLine("我在{0}学习", Class);
Console.WriteLine("我叫{0}.我毕业与{1}", name, school);
}
}
public class Studnet : Person
{
public new void Show(string name)//这个子类重写父类方法,除了方法名没变其他都变了,再使用new会有编译提示,但不算出错,可以不写new了
{
Console.WriteLine("姓名{0}", name);
}
}
class Program
{
static void Main(string[] args)//主函数
{
Studnet stu = new Studnet();
stu.Show("小王");
Console.ReadLine();
}
}
#endregion
姓名小王
子类重载父类方法,子类必须指定重载的关键字(new),而父类被重载的方法则可以不用关键字(virtual)。重载一个方法,是对一个方法重新进行了编写从方法的参数到方法体,唯独方法的名称没有进行改变。重载也可以对原来没有返回类型的方法(void),改变为有返回类型的方法。总体来讲,重载除了方法名不能被改变,另外什么都能重新定义(方法作用域、返回类型、方法体、方法参数)