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

一、概念

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

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

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

时间: 2024-12-18 23:45:28

抽象方法和虚方法 与设计模式的相关文章

OO 抽象方法与虚方法的区别

 抽象方法与虚方法的区别 抽象方法与虚方法的区别: 一.抽象方法: 1.只能在抽象类中定义: 2.不能有方法的实现:(方法体)[因为抽象类无法实例化,所以抽象方法没有办法被调用,也就是说抽象方法永远不可能被实现.] 3.被子类继承后,必须重写: 4.使用关键字abstract修饰: 二.虚方法: 1.可以在抽象类和普通类中定义: 2.可以有方法的实现(方法体,即使空的也要声明) 3.被子类继承后,可以重写也也可以不重写: 4.使用关键字virtrual修饰:

浅谈接口、抽象类、抽象方法和虚方法的区别

C#抽象类和接口孩子间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于抽象类和接口的选择显得比较随意.其实,两者之间还是有很大区别的. 首先说一下接口与抽象类的异同: 相同点: 1.他们都不能实例化自己,也就是说都是用来被继承的. 2.抽象类中的抽象方法和接口方法一样,都不能有方法体 不同点: 1.抽象类里可以有字段,接口中不能有字段. 2.抽象类中的普通方法可以有方法体,而接口方法没有方法体. 3.接口中的方法不能有访问修饰符,抽象类中的抽象方

虚方法的重写与普通方法的隐藏的区别;抽象方法和虚方法有什么区别?

两者都可实现对基类方法的重写 ,虚方法在基类中virtual ,在派生类用override关键字修饰,而普通方法的隐藏在基类不用什么修饰符,而在派生类中用new关键字进行重写 ,我想问,它们同样是方法的重写, c#为什么会有两种方法重写方法,这样设计不是重复了呢, 这怎么理解呢? 不重复,首先如果基类里面的virtual方法被子类继承之后,用override重写之后,那么子类里面就只有一个该方法名的方法了.而另一个普通的,就是在子类里面直接通过new 来新建一个方法那叫重载(多态分为重写和重载)

C#中抽象方法与虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. 抽象方法如下示: public abstract class People   //声明一个抽象类 { public abstract void study();  //抽象方法只能定义在抽象类中. } public class Student:People   //继承抽象类 { public  override void study()     //重写抽象类的抽象方法 { Console.Wr

C# 抽象方法和虚方法的区别

一.抽象方法:只在抽象类中定义,方法修饰符不能使用private,virtual,static. (1)象方法只能声明在抽象类中,使用关键字abstract (2)抽象类中的抽象方法必须被子类重写. [抽象方法没有方法体,子类必须重写方法体!!,因此抽象方法可以看成是一个没有方法体的虚方法] 二.虚方法:使用virtual修饰的方法: 虚方法可以有方法体. 注意事项:virtual修饰符不能与private.static.abstract.override修饰符同时使用. ps:override

面向对象:继承、抽象类、抽象方法、虚方法

1.继承什么是继承?目的:代码重用public class 子类:父类{ }父类 基类 被继承的类子类 派生类 需要继承的类 父类构造函数的继承创建子类对象时,先调用父类构造函数,再调用子类构造函数默认调用父类无参构造函数如果子类有无参构造函数,要求父类也有无参构造函数如果调用父类的有参构造函数,显式用base调用 public 子类(参数列表)base(实参)实参:要调用的父类的有参构造函数的参数列表{} base:父类对象(父类实例) 2.抽象abstract 抽象方法:访问修饰符 abst

抽象方法与虚方法

一.虚方法和抽象方法的区别: 1.虚方法必须有实现,抽象方法必须没有实现 2.抽象方法必须在抽象类中声明,虚方法可以出现在抽象类中 3.抽象方法必须在子类中重写,虚方法可以被重写 4.虚方法可以在普通类中.抽象方法必须在抽象类中. 二.什么时候用虚方法?什么时候用抽象方法? 2.1.什么时候用虚方法: 1.父类本身需要被实例化 2.这个方法在父类中有实现的必要(有意义)(方法有默认的实现.) 2.2.什么时候用抽象方法: 1.在当前系统中,父类绝对不会被实例化.Person p=new Pers

C#中的抽象类、抽象方法和虚方法

[抽象类]abstract 修饰符可与类和方法一起使用定义抽象类的目的是提供可由其子类共享的一般形式.子类可以根据自身需要扩展抽象类.抽象类不能实例化.抽象方法没有函数体.抽象方法必须在子类中给出具体实现.在以下情况下,某个类将成为抽象类:★ 当一个类的一个或多个方法为抽象方法时.★ 当该类为一个抽象类的子类,并且没有为所有抽象方法提供实现细节或方法主体时.★ 当一个类实现一个接口,并且没有为所有抽象方法提供实现细节或方法主体时. abstract class Employee {    pub

关于C#中的抽象类、抽象方法和虚方法的探究

2016年的第一篇文章,容我先喷喷新年的情怀,..........,好了,喷的差不多了. 在面向对象中,我们需要对类进行横向和纵向的认识,不同的类有不同特色的成员,同时在不同类的继承中,子类获得父类的成员也是丰富多彩. 先概述: 1.抽象类 抽象类中不是所有的方法都是抽象方法,对于单纯抽象类而言,是限制类的实例化,可以没有抽象方法.甚至没有任何成员也没事.          2.抽象方法             抽象方法的目的是为了让派生类实现其方法,抽象的方法不实现,抽象方法没有方法体,没有大