第
一文详解C#中重写(override)及覆盖(new)的区别
目录1.重写和覆盖的定义1.1重写(override)的定义1.2覆盖(new)的定义2.两者的区别及示例
1.重写和覆盖的定义
1.1重写(override)的定义
在C#中,用override关键字来重写一个父类中的虚方法或抽象方法。override关键字用于指示编译器,我要用派生类中的一个方法,重写基类中的同名方法。通过重写基类中的方法,可以实现多态性。有关重写与虚方法和抽象方法的详细示例,可移步C#虚方法和抽象方法示例。
override关键字的语法如下:
publicoverridereturnTypeMethodName(ParameterList)
//方法实现
}
其中,public表示访问修饰符;override表示重写虚方法或抽象方法;returnType表示方法的返回类型;MethodName表示方法名称;ParameterList表示方法的参数列表。
需要注意的是,重写方法的访问修饰符必须与被重写方法的访问修饰符相同或更为宽松。
1.2覆盖(new)的定义
在C#中,用new关键字来覆盖一个父类中的成员方法或成员变量。new关键字用于指示编译器,派生类中的一个方法或变量将隐藏基类中的同名方法或变量,从而改变了继承体系中的原有布局关系。
new关键字的语法如下:
newreturnTypeMemberName(ParameterList)
//成员实现
}
其中,returnType表示成员的返回类型;MemberName表示成员的名称;ParameterList表示成员的参数列表。
2.两者的区别及示例
下面是一个示例:
//父类
publicclassFatherClass
publicvirtualstringGetName()
return我是父类中的虚拟方法;
//子类1
publicclassSonClass1:FatherClass
publicoverridestringGetName()
return我是子类1中的重写方法;
//子类2
publicclassSonClass2:FatherClass
publicnewstringGetName()
return我是子类2中的覆盖方法;
}
随后通过程序入口函数调用:
publicclassProgram
publicstaticvoidMain(string[]args)
FatherClassfatherClass=newFatherClass();
Console.Write(直接调用父类中的虚方法:);
Console.WriteLine(fatherClass.GetName());
SonClass1s1=newSonClass1();
Console.Write(直接调用子类1中的重写方法:);
Console.WriteLine(s1.GetName());
SonClass2s2=newSonClass2();
Console.Write(直接调用子类2中的覆盖方法:);
Console.WriteLine(s2.GetName());
FatherClassf1=newSonClass1();
Console.Write(声明父类,调用子类1中的重写方法:);
Console.WriteLine(f1.GetName());
FatherClassf2=newSonClass2();
Console.Write(声明父类,调用子类2中的覆盖方法:);
Console.WriteLine(f2.GetName());
}
运行程序,得到的结果如下:
直接调用父类中的虚方法:我是父类中的虚拟方法
直接调用子类1中的重写方法:我是子类1中的重写方法
直接调用子类2中的覆盖方法:我是子类2中的覆盖方法
声明父类,调用子类1中的重写方法:我是子类1中的重写方法
声明父类,调用子类2中的覆盖方法:我是父类中的虚拟方法
总结:
1:不管是重写还是覆盖都不会影响父类自身的功能。
2:当用子类创建父类的时候,如FatherClassf1=newSonClass1(),重写会改变