-1

好的,所以我对“扩展”和“实现”的使用感到困惑。让我给一个场景,假设我正在制作一个简单的塔防游戏。所以我的理解是,如果我创建一个类(TowerBase.java),我可以用变量和方法填充它,例如;int hp, int damage, int attack(){ ... }, 等等....变量为所述塔的唯一值。我的理解是,在 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:extends 有什么作用
2:如何在程序中直观地使用 extends
3:implements 有什么作用
4:如何在程序中直观地使用 implements
5:在这种情况下我应该使用什么我有许多不同的对象(塔)做几乎相同的事情,也许是 TowerArcher TowerBunker TowerSnipernest TowerBarricade 等。

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

4

3 回答 3

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. 创建抽象类或接口作为基类,并将常见的行为放在那里。

于 2013-07-11T05:12:14.487 回答
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(但不是)的字段可在扩展对象中访问。privateextends

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

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

implements实现接口(接口,因为可以实现更多的接口)。从理论上讲,接口类似于超类,但它们通常只拥有一个属性并使用它进行操作。在你的程序中,你可以创建IFlameThrowingIStoneThrowing接口来管理混凝土塔的一个属性(例如弓箭手不能扔石头,但他们可以射箭)。

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

于 2013-07-11T05:14:04.613 回答
1

extends您的问题与和之间的差异无关implements。您似乎对继承的工作原理有一个很好的理解,或者至少您所说的并没有错。你只是弄乱了语法。您需要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;
    }
}
于 2013-07-11T05:03:20.230 回答