2

抱歉,如果我的问题听起来很奇怪,哈哈,我会尽力解释。我有 4 个班级:Karakter、Karakters、Orc、Human。Orc 和 Human 都扩展了 Karakter。Karakters 是一个包含 Karakter 的 ArrayList。

我在 Orc 和 Human 中都有一个名为:public String getRace() 的方法。现在我想在 Karakters 中使用这种方法?!当我尝试这样做时,它失败了,因为兽人和人类扩展了 Karakter 而不是 Karakter!有没有办法做到这一点?我听说了一些关于抽象的东西:P

谢谢

4

6 回答 6

5

在中声明getRace()方法Karakter(注意英文拼写是“Character”,但这既不是这里也不是那里)。

由于Karakters只知道它正在处理 type 的对象Karakter,因此它无法知道两个实现都有一个getRace方法。在基类中声明方法解决了这个问题。

它应该如下所示:

public abstract String getRace();

并且Karakter课程也必须进行abstract

于 2009-11-12T16:57:48.053 回答
3

当你打电话时,你期望会发生什么Karakters.getRace()

既然Karakters是一个 ArrayList 那么为什么不只是有一个方法getRace(int position),这样你就可以找到感兴趣的人的种族。

我不明白让数组竞争有什么意义。

于 2009-11-12T16:58:07.133 回答
2

这真的没有意义。如果你有一个 ArrayList,那么你可以调用getRace()每个元素:

class Karakters {
    ArrayList<Karakter> kars = new ArrayList<Karakter> ();
    public String getRace () {
        for (Karakter k: kars) {
            ... uh ... which one to return?
        }
        return null; // List is empty
    }
}
于 2009-11-12T16:58:21.673 回答
1

您可以在实现该方法的对象上调用该方法,只要它可以从您的当前类访问。特别是,由于该getRace方法是公共的,任何类都可以调用它,只要它们有适当的实例OrcHuman可以调用它。

我希望您的症结在于您有一个Karakters 列表,而不是 Orcs 或 Humans。因此Karakters,此时仅知道对象是 a Karakter,因此只能调用Karakter类/接口中定义的方法。

一种解决方案是将getRace方法也添加到Karakter类中。如果 this 在超类中返回值没有意义,那么您可以将超类抽象化(这意味着您不能直接构造它的实例,只能构造它的一个子类),并声明该方法也抽象Karakter

public abstract class Karakter
{
    /*
     ...
     ... Same as before
     ...
     */

     public abstract String getRace();
}

这迫使子类有一个实现getRace(这在这里不是问题,因为它们无论如何都会这样做)并且意味着Karakters现在可以确定无论Karakter它有什么样的对象,都有一个 getRace() 方法可以调用。

这只是基于我理解您的意图的解决方案的一种方法。但根本问题是Karakter该类没有定义getRace,因此不能直接在该类型的引用上调用该方法。

于 2009-11-12T17:14:40.577 回答
1

要调用在 Orc 或 Human 中定义的 getRace(),您需要 Orc 或 Human 的对象或其派生类之一(假设该方法在基类中不是私有的)。当然,如果 getRace() 是公共静态的,那么您可以使用类名从任何地方调用它。

于 2009-11-12T16:57:28.270 回答
1

您可以在运行时测试具体类型是什么Karakter并转换为适当的 SubType。

for(Karakter k : karakters) {
   if (k instanceof Orc) {
       ((Ork)k).getRace();
   } else if (k instanceof Human) {
       ((Human)k).getRace();
   }
}

此外,如果 a拥有 a有意义,您似乎可以将方法getRace()入.KarakterKaraktergetRace()

class/interface Karakter {
   abstract String getRace();
}

Karakter如果拥有 a没有意义getRace(),例如,如果有另一种Alien extends Karakter没有 a 的类型,getRace()您可以使用额外的接口进行抽象:

public interface IRacer {
    abstract String getRace();
}

public class Human extends Karakter implements IRacer { ... }
public class Orc extends Karakter implements IRacer { ... }

这样你可以这样做:

for(Karakter k : karakters) {
   if (k instanceof IRacer) {
       ((IRacer)k).getRace();
   }
}

此外,它看起来像您的class Karaktersextends ArrayList。不。优先使用组合而不是继承,并且始终使用ArrayList<Karakter>.

于 2009-11-12T17:04:07.090 回答