虚方法:
要求在继承中,子类重写的方法的方法名,返回值类型、参数列表相同。
关键字 父类virtual
,子类override
virtual
:在一个基类函数声明为 virtual
就可以在任何派生类中重写该函数。
隐藏方法:
如果签名相同的方法在基类和派生类中都进行了声明,但是该方法没有分别声明为virtual 和override
那么派生类就会隐藏基类方法
需要用new关键字
来声明这个方法。
签名相同 : 意思是`返回值`、`方法名`、`形参`都相同
3. 不同点
1. 概念上的不同:
虚方法:
override重写的方法,会导致原来的方法不存在了。
隐藏方法:
当子类有一个签名和父类相同的方法时就会把父类中的该方法隐藏掉。 隐藏只是看不到了,实际上这个方法还存在。
2 调用上的不同:
虚方法的调用:
调用上,使用子类构造的对象调用虚方法,就会调用子类的方法,使用父类构造的对象,就会调用父类的方法。
隐藏方法的调用:
调用上, 使用子类类型的声明调用隐藏方法,就会调用到子类的方法。若想调用被隐藏的方法,需要用父类类型的声明来调用
密封类、密封方法:
C#允许把类和方法声明为sealed
。对于类,这表示不能被继承(任何类不能继承自这个类)。对于方法表示不能被重写。
注意点 :sealed
只能写在重写的方法上,写上以后,表示该方法不能被该类的子类重写了。
抽象类和抽象方法
1. 关键字 abstract
2. 作用 :
可以在父类中定义一个函数,但是不去实现。
所有继承自该类的子类都必须实现该类中的所有抽象函数。
3. 注意点:
不可以用抽象类来进行实例化,但可以用抽象类来声明。
但凡某一个类中有一个抽象方法,那么该类也就必须定义为抽象类。
4. 案例
abstract class Enemy
{
abstract public void attack();
}
class Boss : Enemy
{
public override void attack()
{
Console.WriteLine("我打人挺疼的");
}
}
接口
1. 概念
接口可以定义成员的默认实现。接口不得声明实例数据,如字段或类似属性的事件。
接口不能包含常量、字段、运算符、实例构造函数、析构函数或类型。
接口的默认访问修饰符是Public
,可以修改
每个类只能继承一个类、但是可以实现多个接口。
接口里面定义的方法可以实现或者选择不实现。
调用接口里面实现的方法和调用抽象类里面实现的抽象方法一样