重写,重载,抽象类,接口,抽象类和接口区别
1.多态之重写,重载
重写:当一个子类继承一父类,而子类中的方法与父类中的方法的名称,参数个数、类型都完全一致时,就称子类中的这个方法重写了父类中的方法。
new,virtual,override
virtual方式:
父类使用virtual关键字修饰方法 public virtual void sleep(){},
子类使用override关键字修饰方法 public override void sleep(){}
特定场合:Person p = new Student()时,p.sleep()调用的时子类方法(非常灵活)
重载:一个类中的方法与另一个方法同名,但是参数个数或参数类型不同,这种方法称之为重载方法。
2.密封修饰符:sealed
类: public sealed class A 该类不能作为父类出现,不能被继承,类中的方法不能定义为virtual方法
方法: public sealed override void aaa(){} sealed修饰方法的时候,通常和override配合使用,表明该方法不能再被重写
3.抽象类
作用:提供一个可供多个子类共享的通用基类定义,它是一个特殊的类继承关系,它可以包含一个抽象方法,所有派生子类必须重写实现
案例:Person类,Student类,Teacher类
a. abstract public class Person类中提供抽象abstract public void eat();
b. 抽象类中的抽象方法无需直接实现;
c. 子类使用override重写实现抽象方法
案例:鲫鱼,鲤鱼,Fish类 抽象类Fish类实现抽象方法 子类重写实现
抽象方法:
使用abstract关键字 public abstract bool Withdraw(…);
抽象方法是必须被派生类覆写的方法。
抽象方法是可以看成是没有实现体的虚方法
如果类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包含其它一般方法
虚方法:
使用virtual关键字 public virtual bool Withdraw(…);
调用虚方法,运行时将确定调用对象是什么类的实例,并调用适当的覆写的方法。
虚方法可以有实现体 若一个实例方法的声明中含有 virtual 修饰符,则称该方法为虚拟方法;
一个虚拟方法的实现可以由派生类取代。取代所继承的虚拟方法的实现的过程称为重写该方法;
在一个虚拟方法调用中,该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现。
抽象方法和虚方法的区别:
抽象方法是只有定义、没有实际方法体的函数,它只能在抽象函数中出现,并且在子类中必须重写;
虚方法则有自己的函数体,已经提供了函数实现,但是允许在子类中重写或覆盖。
父类中的抽象方法不包含方法体,子类必须重写;
而虚方法必须要有方法体,子类可以不重写
抽象类不能够被直接实例化, 只能通过抽象类实例化它的子类
4.接口
作用:接口可以实现多继承,一个类只能继承一个父类,但可以实现多个接口,接口也是抽象的体现,适合为不相关的类提供通用功能
案例:人Human、鱼Fish、青蛙Frog
a.定义接口及方法 interface ISwim { void swim(); }
b.给不相干的事物提供一个公共的方法,一个约定
c.实现类需要使用:实现接口,并必须实现接口中的方法
d.封装一个接口调用类,专门负责调用接口实现类中的方法(各司其值)
public void runMethod(ISwim iswim) { iswim.swim(); }
Test t = new Test();
ISwim isw;
isw = new Human();
t.runMethod(isw);
总结: 把实现接口的Class类封装成一个组件,那么当我们的用户需要扩充功能的时候,我们只需要在外部做很小的修改就能实现,
根本就用不着改动我们已经封装好的组件
c#中的系统接口, 举例:使用Person对象类型无法直接进行排序(报错),需要添加IComparable<Person>接口实现CompareTo()方法
5.抽象类和接口区别
抽象类: 共性大于个性,共性相同的个体间必然具有相同的属性与行为,相同行为的实现方式具有一定区别(继承,重写)
接口: 个性大于共性,差异较大的个性间具有某些相同的行为,相同行为的实现方式有较大区别。
案例:
接口: Animal接口, Dog类,Cat类,Tortoise类
void active(); //行为方法,描述各种动物的特性
抽象类: 抽象方法active();