目录

  • 1 项目一 设计贪吃蛇游戏界面
    • 1.1 任务一 分析贪吃蛇游戏需求(DV)
    • 1.2 任务二 学习C#入门知识(D)
    • 1.3 任务三 编写控制台应用程序(V)
    • 1.4 任务四 编写窗体应用程序(V)
    • 1.5 任务五 项目实训
    • 1.6 习题一
  • 2 项目二 实现随机画图
    • 2.1 任务一了解目标和内容
    • 2.2 任务二 学习C#语言的数据类型(D)
    • 2.3 任务三 学习C#语言的运算符和表达式(V)
    • 2.4 任务四 学习GDI+初步(V)
    • 2.5 任务五 项目实训
    • 2.6 习题二
  • 3 项目三 绘画游戏图形元素
    • 3.1 任务一 了解学习目标和项目内容
    • 3.2 任务二 学习顺序与选择结构(D)
    • 3.3 任务三 学习选择结构的窗体应用(V)
    • 3.4 任务四 学习while和do-while循环
    • 3.5 任务五 学习for循环(V)
    • 3.6 任务六 项目实训(V)
    • 3.7 习题三
  • 4 项目四 用方法升级游戏程序
    • 4.1 任务一 了解学习目标和项目内容
    • 4.2 任务二 学习方法的定义与调用(DV)
    • 4.3 任务三 学习方法的嵌套调用(V)
    • 4.4 任务四 学习方法的递归调用(DV)
    • 4.5 任务五 学习方法的参数(V)
    • 4.6 任务六 学习方法重载
    • 4.7 任务七 项目实训(V)
    • 4.8 习题四
  • 5 项目五 用类升级贪吃蛇游戏
    • 5.1 任务一 了解学习目标和项目内容
    • 5.2 任务二 学习面向对象基本概念(D)
    • 5.3 任务三 学习类和对象(V)
    • 5.4 任务四 学习类的静态成员
    • 5.5 任务五 掌握构造函数与析构函数
    • 5.6 任务六 学习对象作参数与返回值为对象(V)
    • 5.7 任务七 项目实训(V)
    • 5.8 习题五
  • 6 项目六 用继承实现同形不同质的物体
    • 6.1 任务一 了解学习目标和项目内容
    • 6.2 任务二 学习基类和派生类(DV)
    • 6.3 任务三 学习派生类构造函数(V)
    • 6.4 任务四 掌握从派生类中隐藏基类成员
    • 6.5 任务五 学习密封类和密封方法
    • 6.6 任务六 学习抽象类和抽象方法(V)
    • 6.7 任务七 项目实训(V)
    • 6.8 习题六
  • 7 项目七 用数组设置游戏元素对应属性
    • 7.1 任务一 了解学习目标和项目内容
    • 7.2 任务二 学习一维数组的声明和创建(DV)
    • 7.3 任务三 学习一维数组的应用
    • 7.4 任务四 学习多维数组
    • 7.5 任务五 学习对象数组(V)
    • 7.6 任务六 学习索引器
    • 7.7 任务七 项目实战(V)
    • 7.8 习题七
  • 8 项目八 利用覆写减少游戏程序耦合
    • 8.1 任务一了解学习目标和项目内容(D)
    • 8.2 任务二 学习编译时多态(V)
    • 8.3 任务三 学习运行时多态(V)
    • 8.4 任务四 项目实训(V)
    • 8.5 习题八
  • 9 项目九 用接口实现多种食物
    • 9.1 任务一了解学习目标和项目内容
    • 9.2 任务二 学习接口的声明与实现(D)
    • 9.3 任务三 学习接口成员的显式实现
    • 9.4 任务四 学习接口与继承(V)
    • 9.5 任务五 学习接口与抽象类
    • 9.6 任务六 项目实战
    • 9.7 习题九
  • 10 项目十 建立分值变化事件
    • 10.1 任务一 了解学习目标和项目内容
    • 10.2 任务二 学习委托
    • 10.3 任务三 学习事件(V)
    • 10.4 任务四 项目实训(V)
    • 10.5 习题十
  • 11 项目十一 保存玩家记录
    • 11.1 任务一了解学习目标和项目内容
    • 11.2 任务二 学习System.IO命名空间和流
    • 11.3 任务三 学习文件的操作
    • 11.4 任务四 学习获取文件基本信息
    • 11.5 任务五 学习文本文件写入和读取(V)
    • 11.6 任务六 学习二进制文件写入和读取
    • 11.7 任务七 项目实训(V)
    • 11.8 习题十一
  • 12 项目十二 处理游戏数据读写异常
    • 12.1 任务一了解学习目标和项目内容
    • 12.2 任务二 学习异常处理的结构(DV)
    • 12.3 任务三 学习System.Exception类的使用(V)
    • 12.4 任务四 项目实训(V)
    • 12.5 习题十二
    • 12.6 课程结语
  • 13 计算机软件技术应用工程师(C#)
    • 13.1 训练一
    • 13.2 训练二
    • 13.3 训练三
    • 13.4 训练四
    • 13.5 训练五
  • 14 课程配套资源
    • 14.1 课标
    • 14.2 课件
    • 14.3 教案
    • 14.4 案例参考
    • 14.5 论文
    • 14.6 专著
      • 14.6.1 获奖
    • 14.7 教材
任务二 学习基类和派生类(DV)
  • 1 基础知识
  • 2 案例—“采访”升级版







继承是面向对象程序设计的主要特征之一,它可以使程序员重用代码,节省程序设计的时间。继承就是在类之间建立一种相交关系,使得新定义的派生类的实例可以继承已有的基类的特征和能力,而且可以加入新的特性或者是修改已有的特性建立起类的新层次。

被继承的类称为父类(或基类),继承的类称为派生类(或子类)。由此可见,继承是对客观世界的直接反映。通过类的继承,能够实现对问题的深入抽象描述,反映出人类认识问题的发展过程。它体现了大自然中特殊与一般的关系。如2012年一夜走红的“江南Style”,那些模仿的舞蹈和鸟叔的“江南Style”之间可以说是一种继承关系,如图6.1所示。鸟叔的“江南Style”中的几个招牌动作和背景音乐体现了骑马舞的一般特征,职员Style和学生Style分别继承了这些特征,并结合了各自特殊的特性。

图6.1  其他Style与江南Style的继承关系


现实世界中的许多实体之间不是相互孤立的,它们往往具有共同的特征,也存在内在的差别。人们可以采用层次结构来描述这些实体之间的相似之处和不同之处,如图6.2所示。

图6.2  类层次结构图


图6.2反映了“车”作为类的派生关系。最高层的实体往往具有最一般最普遍的特征,越靠下层的事物越具体,并且下层包含了上层的特征。它们之间的关系是基类与派生类之间的关系。派生类也可以作为其他类的基类。从一个基类派生出来的多层类形成了类的层次结构。




    如果要声明一个类派生于另一个类,可以使用如下语法: 

‍[修饰符]class 派生类名:基类名

{

//类体

}‍

其中,修饰符可选用public、private、protected、internal、abstract、sealed或new等;基类名为被派生类继承的基类名称。




(1)基类中除了构造函数和析构函数不能被继承外,其他所有成员无论定义了何种访问控制方式,都能被继承到派生类中。

(2)基类中的public成员和protected成员在派生类中可以被直接访问,但是基类中的private成员在派生类中不能被直接访问。

(3)派生类除了从基类继承成员之外,还可以新增自己的成员。

(4)基类或基类对象实例均不能访问派生类自己新增的成员。

(5)继承是可传递的,如果A类派生了B类,B类又派生了C类,则C类不仅继承了B类中声明的成员,同样也继承了A类中的成员。

(6)如果一个类在定义时不使用冒号来显式地从另一个类派生它自己,那么默认该类从Object类派生。所有C#类都直接或间接地从Object类中派生。

(7)C#继承的方法称为单一继承,这意味着派生类只能有一个父类。一些面向对象的语言允许一个类有多个父类,这种继承称为多重继承。C#语言不支持多重继承,而使用接口来提供多重继承的特性。

头脑风暴:

1.如果将鸟叔的“江南Style”定义成一个基类,那么基类的属性和方法有哪些?

2.“贪吃蛇”游戏中食物和障碍物之间可不可以是继承关系?

3.画出电话、移动电话、手机、智能手机和各种品牌的智能手机之间的继承关系。