【问题标题】:How to use a method from a class in another class without extending如何在不扩展的情况下使用另一个类中的类中的方法
【发布时间】:2010-12-15 23:20:57
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 这可能看起来很琐碎 - 但是在 Stack Overflow 上的问题中加上“lol”并不是一个好主意。您花更多的时间准确、深思熟虑地提出问题,您可能获得的回答质量就越高。
  • 谢谢 dtsazza,我会记住的 :)

标签: java class inheritance methods extend


【解决方案1】:

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

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

应该是这样的:

public abstract String getRace();

Karakter 类也必须设为abstract

【讨论】:

  • 他可能因为java.lang.Character而没有使用Character。
  • 谢谢,mmyers。这是我的答案:)
  • @Aaron:是的,我忘了它在java.lang
【解决方案2】:

当您致电Karakters.getRace() 时,您预计会发生什么?

既然 Karakters 是一个 ArrayList,那么为什么不直接使用一个方法 getRace(int position) 以便您可以找到感兴趣的人的种族。

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

【讨论】:

  • 我不希望发生任何事情,我也不调用 Karakters.getRace()。我想这样做:arrayOfKarakters.get(i).getRace().equals("Human") 或 Orc!无论如何谢谢:)
【解决方案3】:

这真的没有意义。如果你有一个 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
    }
}

【讨论】:

  • 我想在 ArrayList 中查找每个 Karakter,看看是 arrayL.get(i).getRace().equals("Human") 还是 "Orc"
【解决方案4】:

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

【讨论】:

    【解决方案5】:

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

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

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

    public abstract class Karakter
    {
        /*
         ...
         ... Same as before
         ...
         */
    
         public abstract String getRace();
    }
    

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

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

    【讨论】:

      【解决方案6】:

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

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

      此外,如果Karakter 有一个getRace() 有意义,您似乎可以将方法getRace() 推到Karakter

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

      如果Karakter 拥有getRace() 没有意义,例如,如果有另一种类型Alien extends Karakter 没有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 Karakters 似乎扩展了 ArrayList。别。优先使用组合而不是继承,并且始终使用ArrayList&lt;Karakter&gt; 的通用版本。

      【讨论】:

      • 不,Karakters 没有扩展 ArrayList,我正在使用 ArrayList :) 谢谢。
      猜你喜欢
      • 2016-03-11
      • 1970-01-01
      • 2023-04-07
      • 2023-03-24
      • 2018-12-19
      • 2013-05-16
      • 2015-07-02
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多