当子类从父类继承时,它会获得父类的所有方法、字段、属性和事件。C#语言使用虚方法表达多态。若要更改父类的属性和方法,可以有两种方法:
第一种:可以使用新的子类成员替换父类成员
第二种:可以重写虚拟的父类成员。
使用新的子类成员替换父类的成员需要使用 new 关键字。如果父类定义了一个方法、字段或属性,则new 关键字用于在子类中创建该方法、字段或属性的新定义。new 关键字放置在要替换的类成员的返回类型之前。例如:
(为了书写方便,类中的字段就使用public修饰,省去属性的书写)
class Person
{
public void SayHello()
{
Console.WriteLine(“大家好,我是人”);
}
public string name;
public int age;
}
class Teacher :Person
{
public new void SayHello()
{
Console.WriteLine(“大家好,我是教师”);
}
public string name;
public int age;
}
使用 new 关键字时,调用的是子类成员而不是已被替换的父类成员。这些父类成员已被new关键字隐藏
为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加 virtual 关键字来实现的。然后,子类可以使用 override 关键字而不是 new
例如:
class Person
{
public virtual void SayHello()
{
Console.WriteLine(“大家好,我是人”);
}
public string name;
public int age;
}
class Teacher :Person
{
public override void SayHello()
{
Console.WriteLine(“大家好,我是教师”);
}
public string name;
public int age;
}
虚方法与重写
方法不能用static修饰
方法重写与基类的签名必须一致(重写的时候方法名和参数都要一致)
virtual不能与private一起使用
重写override与重载overload的区别
重载是方法的名称相同,参数或参数类型不同,进行多次重载以适应不同的需要。重载是面向过程的概念
重写是进行基类中函数的重写,override是面向对象的概念
重写和重载不一样,要区分开
抽象类和抽象方法:
如果一个类中有一个方法加上了abstract(放在访问修饰符后面),那么这个方法就叫抽象方法,而且抽象方法没有方法体;同时那么这个方法所在的类也必须要用abstract来修饰,那么这个类就变成了抽象类
抽象类不能被实例化
如果一个类继承了抽象类,那么这个类中的方法必须重写父类的抽象方法
Abstract使用注意:
1. 抽象方法没有方法体
2. 抽象成员只能存在于抽象类中
3. 抽象类可以有非抽象成员
4. 抽象类的派生类必须实现抽象方法体
5. 抽象类只能用作基类,无法实例化
虚方法和抽象方法比较
虚方法 | 抽象方法 |
用virtual修饰 | 用abstract修饰 |
要有方法体 | 不允许有方法体 |
可以被子类override | 必须被子类override |
除了密封类都可以写 | 只能在抽象类中 |