抽象方法和虚方法是什么?先写一段代码看看他们俩的区别。
抽象方法使用abstract关键字;虚方法使用virtaul关键字。
<span style="font-size:18px;">//抽象方法 Public abstract class TestPaper { Public abstract Answer(); } </span>
<span style="font-size:18px;">//虚方法 Public class TestPaper { Public virtual Answer(){} } </span>
抽象方法:
1、只容许在抽象类中使用抽象方法声明;
2、abstract修饰符可以和类、方法、属性、索引器及事件一起使用;
3、抽象方法声明不提供实际的实现,所以没有方法体;
4、抽象方法声明中使用static或virtual修饰符是错误的;
虚方法:
1、虚方法声明的时候必须有实现部分,子类可以重写逻辑也可以继续使用虚方法的逻辑;
2、virtual关键字用于修饰方法、属性、索引器或事件声明;
两种方法相同之处有:都可以实现多态,具体例子看下面的两个模式。重写他们的时候都是用override。
模板方法模式:
Class Testpaper{ Public void TestQuestion1(){ Console.WriteLine("杨过给郭靖连成屠龙刀和倚天剑的玄铁是()a、球磨铸铁 b、马口铁 c、合金钢 d、纳米纤维"); Console.WriteLine("答案:"+Answer1()); } Public virtual string Answer1(){//虚方法具有逻辑结构 Return ""; } }
Class StudentA:TestPaper{ Public override string Answer1(){//重写虚方法 Return "a"; } }
Static void main(string[] args){ Console.WriteLine("学生甲的试卷:"); TestPaper StuA =new StudnetA();//利用多态实现了代码的复用 StuA.TestQuestion1(); Console.read(); }
观察者模式:
Abstract class Subject{ Private Ilist<Observer> observer=new List<Observer>();//利用泛型,收集所有观察者 Public void Attach(Observer ovserver){//添加观察者 Observer.Add(observer); } Public void Detach(Observer observer){//移除观察者 Observer.Remove(observer); } Public void Notify() { Foreach(Observer o in observers)//调用了这个方法的对象会被通知到修改状态 { o.Update(); } } }
Abstract class observer{ Public abstract void Update(); //抽象方法 } Class ConcreteSubject:Subject{ Private string subjectState; Public string SubjectState{ get{return subjectState;} Set{subjectState=value;} } }
Class ConcreteObserver:Observer { Private string name; Private string observerState; Private ConcreteSubject subject; Public concreteObserver( ConcreteSubject subject ,string name){ This.subject=subject; This.name=name; } Public override void Update() //重写方法 { observerState=subject.SubjectState; Console.WriteLine("观察者{0}的新状态是{1}",name,observerState); } Public ConcreteSubject subject{ get{return subject;} Set{subject=value;} } }
Static void Main(string[] args) { ConcreteSubject s =new ConcreteSubject(); s.Attch(new ConcreteObserver(s,"X")); s.subjectState="ABC"; s.Notify(); Console.read(); }
总结:抽象方法本身不是真实的方法体,如果不在子类中实现这个方法,就可当他不存在,而且只能在抽象类中声明这个方法;而虚方法则不是,它可以有自己的逻辑结构,子类可以选择覆盖或者直接使用父类的方法