抽象方法和虚方法 与设计模式

来源:互联网 发布:不要钱的恋爱软件 编辑:程序博客网 时间:2024/06/09 18:17

一、概念

抽象方法和虚方法是什么?先写一段代码看看他们俩的区别。

抽象方法使用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();}


总结:抽象方法本身不是真实的方法体,如果不在子类中实现这个方法,就可当他不存在,而且只能在抽象类中声明这个方法;而虚方法则不是,它可以有自己的逻辑结构,子类可以选择覆盖或者直接使用父类的方法





1 0
原创粉丝点击