《Android游戏开发详解》一3.5 继承

3.5 继承

Android游戏开发详解
在设计对象的分类的时候,你可能会发现另一种叫作继承(inheritance)的模式,它给了我们更多的控制权。继承描述了这样一种现象,一个类继承了另一个类中的变量和方法。在这种情况下,继承者称为子类(subclass,或孩子类),而祖先称作超类(superclass,或者父类)。

使用继承比使用接口的优点在于,可以具备复用代码的能力。还记得吧,实现了一个接口的每一个类,都必须针对接口中声明的每一个抽象方法提供一个完整的实现。使用前面小节的例子,这意味着,King、Villain、Professor和SushiChef,都必须拥有它们自己的eat()、walk()和urinate()方法。在这种情况下,继承很强大,因为它允许相似的类共享方法和变量。我们将使用一个假想的角色扮演游戏的例子来说明这一点。

在创建一款角色扮演游戏的时候,你可能有一个名为Hero的类来表示玩家角色,如程序清单3.10所示。

程序清单3.10 Hero类

01 public class Hero {
02    protected int health = 10; // We will discuss ‘protected’ later in this section
03    protected int power = 5;
04    protected int armor = 3;
05
06    public void drinkPotion(Potion p) {
07     health += p.volume(); // Equivalent to health = health + p.volume();
08    }
09    
10    public void takeDamage(int damage) {
11    int realDamage = damage - armor;
12    if (realDamage > 0) {
13      health -= realDamage; // Equivalent to health = health – realDamage.
14    }
15    }
16    
17    // ... more methods
18
19 }

在创建了Hero之后,你随后决定要让自己的RPG和竞争者有所区分,那就实现一个独特的类系统,其中玩家能够在此前没有见过的Warrior、Mage和Rogue类之间做出选择。

接下来,和任何值得尊敬的面向对象程序员会做的一样,你为每一种角色类型创建了一个单独的Java类,因为Warrior、Mage和Rogue中的每一个都应该具有无法想象的强大而独特的能力。你还决定,既然所有的角色类都是泛型的Hero类的第一个和最重要的扩展,它们每一个都应该拥有程序清单3.10中的Hero类的所有变量和方法。这就是继承的用武之地。

来看一下程序清单3.11到程序清单3.13。

程序清单3.11 Warrior类

public class Warrior extends Hero {

    //    ... other variables and methods
    public void shieldBash() {
        ...
    }
}

程序清单3.12 Mage类

public class Mage extends Hero {

    //  ... other variables and methods
    public void useMagic() {
      ...
    }
}

程序清单3.13 Rogue类

public class Rogue extends Hero {

    //    ... other variables and methods
    public void pickPocket() {
        ...
    }
}
注意
,```
我们使用关键字extends表示继承。这是合适的,因为所有这3个类都是超类Hero的扩展。在继承中,每个子类都针对超类中的所有非私有的变量和方法,接受它们自己的版本(程序清单3.10中的protected变量,类似于private变量,因为外部类是无法访问它们的;然而,和private变量不同,在继承中,子类是可以访问它们的)。

在应用多态的时候,继承的好处最明显,多态允许我们在如下所示的一个方法中使用Hero的任何子类。

// Will attack any Hero regardless of Class
public void attackHero(Hero h, int monsterDamage) {
      h.takeDamage(monsterDamage);
}

时间: 2024-08-03 19:23:45

《Android游戏开发详解》一3.5 继承的相关文章

《Android游戏开发详解》一2.20 对象的更多实践——模拟一个色子

2.20 对象的更多实践--模拟一个色子 Android游戏开发详解 在我们的下一个项目中,将模拟一个六面色子的滚动.色子会出现在许多现代的桌上游戏中,因为它们增添了不可预期的因素,如图2-26所示.在本节中,我们将展示在Java程序中如何模拟这种随机性. 我们首先创建一个名为"DiceProject"的新的Java项目.其中,创建一个名为DiceMaker的新的类,并且像通常一样给它一个main方法. 要产生一个随机数,我们必须使用Java库中名为Random的一个内建类.我们使用熟

《Android游戏开发详解》——第2章,第2.20节对象的更多实践——模拟一个色子

2.20 对象的更多实践--模拟一个色子 Android游戏开发详解 在我们的下一个项目中,将模拟一个六面色子的滚动.色子会出现在许多现代的桌上游戏中,因为它们增添了不可预期的因素,如图2-26所示.在本节中,我们将展示在Java程序中如何模拟这种随机性. 我们首先创建一个名为"DiceProject"的新的Java项目.其中,创建一个名为DiceMaker的新的类,并且像通常一样给它一个main方法. 要产生一个随机数,我们必须使用Java库中名为Random的一个内建类.我们使用熟

《Android游戏开发详解》——第1章,第1.3节声明和初始化变量

1.3 声明和初始化变量 Android游戏开发详解 所有的基本数据类型(和字符串)都可以表示为变量.它们都是使用相同的基本语法来声明(创建)的. 创建一个新的变量的时候,我们总是要声明两件事情:变量的数据类型(data type)和变量的名称(variable name).在大多数情况下,我们还使用赋值运算符(assignment operator,即=)给变量指定一个初始值.有两种方法做到这点.第一种方法是指定一个字面值(literal value),例如,图1-1所示的'J'.第二种方法是

《Android游戏开发详解》一2.5 魔术揭秘——编译器和JVM

2.5 魔术揭秘--编译器和JVM Android游戏开发详解 在我们点击运行按钮和出现"Hello, world-?"之间,发生了什么事情.不管你是否相信,所有的事情都是在幕后进行的.当我们编写源代码的时候,Java编译器会编译它,这意味着,它会检查代码潜在的错误并将其转换为只有机器能够理解的语言.这个机器,就是执行代码并把想要的文本打印到控制台的Java虚拟机(Java Virtual Machine,JVM).如图2-18所示. JVM是一个虚拟的机器.它运行于操作系统之上,并且

《Android游戏开发详解》一2.2 设置开发机器

2.2 设置开发机器 Android游戏开发详解 在开始编写简单点的Java程序和构建令人兴奋的游戏之前,我们必须在自己的机器上安装一些软件.然而,这个过程有点枯燥且颇费时间,但是,为了让第一个程序开始运行,这些代价都是值得的. 2.2.1 安装Eclipse 我们将利用一个集成开发环境(Integrated Development Environment,IDE)来编写Java/Android应用程序.IDE是一种工具的名称,它能够帮助我们轻松地编写.构建和运行程序. 我们将要使用的IDE叫作

《Android游戏开发详解》——第2章,第2.2节设置开发机器

2.2 设置开发机器 Android游戏开发详解 在开始编写简单点的Java程序和构建令人兴奋的游戏之前,我们必须在自己的机器上安装一些软件.然而,这个过程有点枯燥且颇费时间,但是,为了让第一个程序开始运行,这些代价都是值得的. 2.2.1 安装Eclipse 我们将利用一个集成开发环境(Integrated Development Environment,IDE)来编写Java/Android应用程序.IDE是一种工具的名称,它能够帮助我们轻松地编写.构建和运行程序. 我们将要使用的IDE叫作

《Android游戏开发详解》——第1章,第1.7节控制流程第1部分——if和else语句

1.7 控制流程第1部分--if和else语句 Android游戏开发详解 我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行.还记得代码执行的基本规则吧,它是说代码要从上到下地执行.在最简单的程序中,代码真的是按照线性方式从上向下执行的.然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行.让我们来看一些例子. 1.7.1 if-else语句块 if-else语句

《Android游戏开发详解》一1.7 控制流程第1部分——if和else语句

1.7 控制流程第1部分--if和else语句 Android游戏开发详解 我们现在把注意力转向控制流程(control flow ,也称为流程控制,flow control),这指的是代码行将要按照什么样的顺序执行.还记得代码执行的基本规则吧,它是说代码要从上到下地执行.在最简单的程序中,代码真的是按照线性方式从上向下执行的.然而,在任何有用的程序中,我们可能会看到,根据某些条件,会跳过一些代码行甚至重复执行一些代码行.让我们来看一些例子. 1.7.1 if-else语句块 if-else语句

《Android游戏开发详解》一1.2 数据类型

1.2 数据类型 Android游戏开发详解 1.2.1 基本类型 在前面的示例中,我们看到了数据类型(data type)的例子.例如,在程序清单1.1中,我们使用了整数值(integer value)5和6,这两个都是数值数据的例子.我们来看看其他的数据类型,先介绍其他的数值类型. 可以使用4种类型来表示整数(Integer),每种类型都用不同的大小.在Java中,我们有8位的byte.16位的short.32位的int和64位的long.4种类型中的每一种,都可以保存正的和负的整数值. 有

《Android游戏开发详解》一1.4 关于位的一切(位和字节的简单介绍)

1.4 关于位的一切(位和字节的简单介绍) Android游戏开发详解 在我们继续深入之前,值得先细致地介绍如何具体把值存储到变量中.我前面提到,不同的基本数据类型具有不同的位大小.例如,一个int有32位而一个long有64位.你可能会问,那么,到底什么是位? 位(bit)是一个二进制位的简称.换句话说,如果你有一个只有0和1的二进制数,每个数字就是1位.达到8位的时候,例如,(10101001),你就有了1字节. 对于位,你需要记住的一点是:拥有的位越多,所能表示的数值也越多.为了说明这一点