抽象方法和抽象类

上传人:第*** 文档编号:51835079 上传时间:2018-08-16 格式:PPT 页数:15 大小:41KB
返回 下载 相关 举报
抽象方法和抽象类_第1页
第1页 / 共15页
抽象方法和抽象类_第2页
第2页 / 共15页
抽象方法和抽象类_第3页
第3页 / 共15页
抽象方法和抽象类_第4页
第4页 / 共15页
抽象方法和抽象类_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《抽象方法和抽象类》由会员分享,可在线阅读,更多相关《抽象方法和抽象类(15页珍藏版)》请在金锄头文库上搜索。

1、抽象方法和抽象类多态性n在程序中同一符号或名字在不同情况下具有 不同解释的现象称为多态性。表现在两方面 :q方法的重载。q对象的上转型对象。子类可以改写父类的方法, 而上转型对象(父类的对象)可以调用改写后的 方法。不同的子类可能改写的内容不同。比如: 动物类中的cry()方法,在子类“猫”中可以改写为“ 喵喵”,而在子类“狗”中可以改定为“汪汪”。猫类的 和狗类的上转型对象在调用cry()方法时是各不相 同的。n一个类可能会有很多的子类,这些子类中都有共同 的行为,但行为的实现方法有所差异,为了迫使在 编写子类时均实现这些方法,且保持统一的名称, 可以事先在这些子类共同的父类中将方法的类型、

2、 名称、形参等确定下来,而方法体在子类中确定, 对这种父类并不具体实现这些方法,而只定义了方 法类型、名称、形参等的方法称为抽象方法,在定 义时需在方法名称前加abstract,具有一个以上抽象 方法的类称为抽象类,类名称前也要加修饰词 abstract, 抽象方法和抽象类n抽象类是指不能被实例化的类,是派生类的基础,通过部分实面或不实现.抽 象类可作为其它类的模板.n声明抽象类的语法如下:nabstract class 类名nn.n n 1.抽象方法是隐式的虚方法.n2.只允许在抽象类中声明抽象方法n3.抽象方法声明不提供实际的实现,没有方法体,方法声明以一个分号结束,并 在声明后没有大括号

3、.n例如:n public abstract void Area( );举例n举一个简单的例子,“图形”这个类是抽象的,它的成员方法“计 算图形面积”也就没有实际的意义。面积只对“图形”的派生类比 如“圆”、“正方形”这些非抽象的概念才有效,那么我们就可以把 基类“图形”的成员方法“计算面积”声明为抽象的,具体的实现交 给派生类通过重载来实现。分析:n抽象类:图形,抽象方法求面积n(指出:图形必须有求面积的方法,但因为不同图形求面积的方 法不一样,因此将此方法声明为抽象方法)n子类:正方形类,实现了抽象类中求面积的抽象方法。n子类:圆,实现了抽象类中求面积的抽象方法。abstract publ

4、ic class Dimensions /声明类Dimensions为抽象类protected double x;public const double PI = Math.PI; public Dimensions(double x)this.x=x; public abstract double Area();/ 在抽象类Dimensions中声明抽象方法Area() public class Circle : Dimensionspublic override double Area()/派生类Circle中必须使用override修饰 符实现基类中的抽象方法Area( )Console

5、.WriteLine(“该方法计算圆的面积“);return PI * x * x; public class Squre : Dimensionspublic override double Area()/派生类Squre中必须使用override修饰 符实现基类中的抽象方法Area( )Console.WriteLine(“该方法计算正方形的面积“);return (x*x);特征n抽象方法:只包含方法定义,但没有具体实现的方法,需要其子类或 者子类的子类来具体实现。 n 静态方法不能标记为 override、virtual 或 abstract,即静态方法都必须 是具体的 n抽象类:含有

6、一个或多个抽象方法的类称为抽象类,在声明时,类名 前须添加“abstract”关键字 ,但抽象类中可以包含非抽象方法 n抽象类不能够被实例化,这是因为它包含了没有具体实现的方法,即 可实例化的类一定不是抽象类,不包含未具体实现的抽象方法。 n抽象方法不能是私有的,它必须为公共的。 n子类继承抽象父类后,可以使用override关键字覆盖父类中的抽象方法 ,并做具体的实现。也可以不实现抽象方法,留给后代实现,这时子 类仍旧是一个抽象类,必须声明为abstract 抽象类的好处n当更新组件版本时,可根据需要将附加方法 添加到基类,但抽象方法和属性必须保持不 变。n它可以很好的组织类的结构,举个例子

7、。我 们将人建模为一个抽象类,将人类共有的特 性在抽象类中实现。而不同群体的人的不同 特质则可以用派生类来体现。 abstract和virtual定义函数的区别n虚方法必须有实现部分,并为派生类提供了覆盖该方法的选项 抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的 方法,否则派生类将不能被实例化 n/抽象方法 public abstract class Animal public abstract void Sleep();public abstract void Eat(); n/虚方法 public class Animal public virtual void Sleep()

8、public virtual void Eat() n抽象方法只能在抽象类中声明, 抽象方法必须在派生类中重写 虚方法不是 也不必要重写。其实如果类包含抽象方法,那么该 类也是抽象的,也必须声明为抽象的。npublic class Animal public abstract void Sleep();public abstract void Eat(); n编译器会报错: Main.cs(10): VSTest.Animal.Sleep() is abstract but it is contained in nonabstract class VSTest.Animal Main.cs(1

9、1): VSTest.Animal.Eat() is abstract but it is contained in nonabstract class VSTest.Animal3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。抽象方法不 能声明方法实体 而虚方法可以 包含抽象方法的类不能实例化 ,而包含虚方法的类可以实例化! npublic abstract class Animal public abstract void Sleep();public abstract void Eat(); npublic class Cat : Animal public overri

10、de void Sleep()Console.WriteLine( “Cat is sleeping“ );/ we need implement Animal.Eat() heren 编译器会报错:Main.cs(14): VSTest.Cat does not implement inherited abstract member VSTest.Animal.Eat(),因为我们没有实现抽象类中所有抽 象方法。nVirtual:当一个方法被声明为Virtual时,它是一个虚拟方法,直 到你使用ClassName variable = new ClassName();声明一个类 的实例之前,

11、它都不存在于真实的内存空间中。这个关键字在类 的继承中非常常用,用来提供类方法的多态性支持。noverrride:表示重写 这个类是继承于Shape类 public override double Area 这个属性再shape中肯定存在 但是 这里我们不想用shape中的 所以要重写 virtual,abstract是告诉其它想继承于他的类 你可以重写我的这 个方法或属性,否则不允许。n一个生动的例子 :老爸表示基类(被继承的类) 儿子表示子类( 继承的类)n老爸用virtual告诉儿子:“孩子,你要继承我的事业,在这块上面可以 自己继续发展你自己的“n儿子用override告诉全世界:“这

12、个我可不是直接拿我爸的,他只是 指个路给我,是我自己奋斗出来的“ abstract:抽象方法声明使用,是必须被派生类覆写的方法,抽 象类就是用来被继承的;可以看成是没有实现体的虚方法;如果 类中包含抽象方法,那么类就必须定义为抽象类,不论是否还包 含其他一般方法;抽象类不能有实体的。小结n用abstract关键字来修饰一个类时,这个类叫 做抽象类;用abstract来修饰一个方法时,该 方法叫做抽象方法。nabstract类必须被继承,abstract方法必须被 重写。n抽象类不能被实例化(直接创建对象)。n抽象方法只需声明,而不需实现(无方法体 )。作业按以下要求编写程序创建一个抽象的车类,

13、包括各种车辆。至少包含一个抽象方 法。成员变量: 品牌、可载人数、轮子个数、能源等。抽象 方法如:跑、加速、刹车等。 通过继承车类重新声明公共汽车类和普通自行车类。在子类 中实现父类中抽象方法 构造方法对应区分为公共汽车和普通自行车。子类的构造方 法中根据不同的类设置不同的默认值,如汽车类可以默认轮 子个数是4个,可载人数50个,能源为汽油。n创建一个控制台应用程序,其中声明一个抽象类 myClass,该抽象类中声明了两个属性和一个方法 ,其中,为两个属性提供了具体实现,方法为抽象 方法。然后声明一个派生类DriveClass,继承自 myClass,在DriveClass派生类中重写myClass抽象 类中的抽象方法,并提供具体的实现。最后在主程 序类Program的Main方法中实例化DriveClass派生 类的一个对象,使用该对象实例化抽象类,并使用 抽象类对象访问抽象类中的属性和派生类中重写的 方法。程序代码如下。(实例位置:光盘 TMsl104)

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 其它办公文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号