抽象方法和虚方法是什么?先写一段代码看看他们俩的区别。
抽象方法使用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();
}
总结:抽象方法本身不是真实的方法体,如果不在子类中实现这个方法,就可当他不存在,而且只能在抽象类中声明这个方法;而虚方法则不是,它可以有自己的逻辑结构,子类可以选择覆盖或者直接使用父类的方法
原文:http://blog.csdn.net/mayfla/article/details/45745689