Java - 如何正确使用Extends / Implements

时间:2013-07-11 04:57:01

标签: java lwjgl extends slick2d implements

好吧所以我对“扩展”和“工具”的使用感到困惑。让我举一个场景,假设我正在制作一个简单的塔防游戏。所以我的理解是,如果我创建了一个类(TowerBase.java),我可以用变量和方法填充它,例如; int hp,int damage,int attack(){...}等....我想我可以制作多种类型的塔,让我们说一个是射手塔,在TowerArcher.java里面我想设置TowerBase的变量为所述塔的唯一值。我的理解是,在TowerArcher内部,如果我扩展TowerBase,我可以访问所有TowerBase的变量和方法,因为TowerBase现在是父类。所以我尝试了这个:

public class TowerBase {
    //Health (Range: 1-100)
    int hp;

    public int attack(int blah){
        //Blah blah how the tower goes about attacking foe
    }

然后在TowerArcher.java

public class TowerArcher extends TowerBase{
    //Set TowerArcher's unique values
    hp = 10;
}

现在游戏的某个地方......

TowerArcher archer;
archer.attack(blah);

Eclipse在TowerArcher.java中以“hp = 10;”抛出此语法错误:此标记之后的VarableDeclaratorId。我认为它说它不知道什么是HP。这让我感到困惑,因为我认为它会知道什么是HP,因为它在父类中。我找到了解决办法,但它们看起来并没有那么有效,即使它们有效,它们仍然让我感到困惑的是扩展和实现是什么。基本上我想在这里找到的是;
1:扩展的作用是什么?2:我如何直观地使用程序中的扩展?3:实现了什么?4:我如何直观地在程序中使用工具
5:在这种场景中我应该使用什么,我有许多不同的物体(塔)做几乎相同的事情,也许TowerArcher TowerBunker TowerSnipernest TowerBarricade等。

我知道我要求一个很多,但我找不到一个好的帖子,所以这也可以帮助其他人:)。PS如果我遗漏任何所需信息,请告诉我。我现在很无能为力。

3 个答案:

答案 0 :(得分:1)

您的问题与extendsimplements之间的差异无关。您似乎对继承如何工作有一个很好的理解,或者至少你所说的没有错。你只是弄乱了语法。您需要在构造函数中设置hp

public class TowerArcher extends TowerBase {
    // Can't set hp here; the syntax just doesn't work that way.
    // hp = 10;

    public TowerArcher() {
        // Initialize it here, instead.
        // This runs when you construct a TowerArcher.
        hp = 10;
    }
}

答案 1 :(得分:1)

public class TowerArcher extends TowerBase{
//Set TowerArcher's unique values
hp = 10;  //define your data type here..
}

您的问题的答案。

  1. extends用于扩展类或将接口扩展到另一个接口。您只能在java中扩展一个类。当A扩展B时,A继承了B的行为。

  2. TowerArcher扩展了TowerBase。

  3. implements用于实现接口。您可以在java中为一个类实现多个接口。您必须覆盖类中接口中的所有方法签名。

  4. 将抽象类型的方法放在接口中并将其实现到您的类中。

  5. 创建抽象类或接口作为基类,并在其中放置常见行为。

答案 2 :(得分:1)

在你的示例代码中,你试图在类体中设置变量值 - 因为类体的直接内容永远不会被执行(字段初始化除外),所以它是无效的。您必须将代码放入某个方法(例如构造函数)。

public class TowerArcher extends TowerBase{
    public TowerArcher() {
        super(); //set values as in TowerBase constructor
        hp = 10; //archers don't wear armor, so they have low HP.
    }
}

extends只使用指定父类的形式作为后代字段,并作为方法的基础,但不必覆盖。可以在扩展对象中访问超类中设置为publicprotected(但不是private)的字段(这是extends关键字后面的类的正式名称)。

在您的计划中,您正确使用extends。新类型的塔将带来新的类,这将扩展TowerBase

请注意,extends个关键字只能将一个类用作父级。

implements实现接口(接口,因为您可以实现更多接口)。在理论基础上,接口类似于超类,但它们通常只包含一个属性,并且它们随之操作。在你的程序中,你可以创建IFlameThrowingIStoneThrowing接口,这些接口只管理混凝土塔的一个属性(例如,弓箭手不能扔石头,但它们可以射箭)。

你有许多不同的塔,所以创建结构将所有提到的东西划分为塔和属性。然后实现它。如果你想允许玩家在游戏过程中向他的塔增加升级(例如学习弓箭手如何投掷石块),请使用装饰模式。