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

一、概念

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

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


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





你可能感兴趣的:(抽象方法和虚方法 与设计模式)