方法重载
方法重载:构造函数就属于特殊的方法重载
方法重载:是指同一个类中相同方法的不同行为
方法重载的特点:
1.方法名必须相同
2.参数列表必须不相同(这里的不相同是指参数类型,参数个数以及参数顺序)
3.在有相同参数列表个数的前提下,函数方法返回值不作为判断方法是否重载的依据
class Math
{
public int sum(int a,int b)
{
return a + b;
}
public float sum(int a, float b)
{
return a + b;
}
public float sum(float a, float b)
{
return a + b;
}
public float sum(float a, int b)//不同参数类型的顺序也可以作为方法重载的依据
{
return a + b;
}
}
在调用这些方法时,只要将参数写成那种方法的参数列表就可以了
方法的重写
方法的重写:是指在继承关系中不同类之间的比较和研究
第一个关键字:virtual(虚拟的)
用virtual修饰的方法称之为虚方法
virtual一般情况下和override成对出现
如果子类重写了override,则父类必须拥有virtual修饰的方法
反过来则不一定成立,因为我们还有方法覆盖
第二个关键字:override(重写)
为什么要使用方法重写呢
1.使用虚方法其实就是对目前的程序不满意,暂时方法功能是实现了的,但是不够完美,希望后面的程序员通过重写父类方法的方式,进行功能上的优化
2.可以通过继承系统提供的类,去修改系统类中提供的虚方法
方法重写需要注意的地方
1.不能重写父类中有sealed修饰的方法
2.不能重写父类中用static修饰的方法
3.如果父类中存在abstract方法,子类必须重写
class Animal//动物类有一个行为(方法)就是叫
{
public virtual void jiao()//使用虚方法实现叫这个方法,但是这个方法不够完美,需要子类去调用重写
{
Console.WriteLine ("叫");
}
}
class Cat:Animal//子类继承父类
{
public override void jiao()//子类重写父类方法
{
Console.WriteLine ("猫叫");
}
}
class Laohu:Animal
{
public override void jiao()//子类重写父类方法
{
Console.WriteLine ("老虎叫");
}
}
class Lion:Animal
{
public override void jiao()//子类重写父类方法
{
Console.WriteLine ("狮子叫");
}
}
这就体现了面向对象中多态。
密封类
密封类:俗称断子绝孙类....
如果我们的类是密封类,那么就意味着不能有任何派生类,但是密封类可以拥有父类
C#中密封类用sealed关键字,sealed可以将类或者方法声明为密封类或者密封方法,
对于密封类来说,不能继承该密封类。
对于密封类来说,不能重写该密封方法
密封类不能使用protected,访问修饰符
密封类不能使用virtual
密封类的不可继承性,所以密封类不能声明为抽象的,即sealed关键字不能和abstract共同使用
如果用sealed修饰方法,必须要遵循一个条件:这个类要有父类,并且重写了父类的某一个虚方法才可以用sealed修饰,否则是绝对不行
密封类的作用就是防止外界修改到本类,破坏类的内部构造。
class A//创建父类A
{
public virtual void SayHi(){}//父类A中有虚方法
}
sealed class B:A//父类满足有虚方法这个条件,可以用sealed修饰
{
public override void SayHi (){}//重写了父类的虚方法
}
class C:A
{
public sealed override void SayHi (){}
}
class E:C
{
public override void SayHi (){}//这样的写法是错误的,因为在C类中这个方法是用sealed修饰的,是密封方法所以无法被重写,编译不能通过
}
class D:A//其他类继承A这个父类与B这个密封类没有关系
{
public override void SayHi(){}
}