代码之家  ›  专栏  ›  技术社区  ›  Loolooii

如何使用另一个类中某个类的方法而不扩展

  •  2
  • Loolooii  · 技术社区  · 16 年前

    对不起,如果我的问题听起来很奇怪,我会尽力解释的。 我有四门课:空手道,空手道,兽人,人类。兽人和人类都在扩展空手道。空手道是一个有空手道的排练家。

    我在ORC和Human中都有一个方法,名为:public string getrace()。现在我想在空手道上用这个方法?!!!当我尝试这样做的时候,它失败了,因为兽人和人类扩展了空手道而不是空手道!有办法吗?我听说了一些抽象的东西:p

    谢谢

    6 回复  |  直到 16 年前
        1
  •  5
  •   Michael Myers KitsuneYMG    16 年前

    宣布 getRace() 方法在 Karakter (请注意,英语拼写是“character”,但这里和那里都没有)。

    自从 Karakters 只知道它处理的是类型的对象 空手道 ,它不知道两个实现都有一个 getRace 方法。在基类中声明方法可以解决这个问题。

    它应该是这样的:

    public abstract String getRace();
    

    以及 卡拉克特 还必须上课 abstract .

        2
  •  3
  •   James Black    16 年前

    你打电话的时候会发生什么事? Karakters.getRace() 是吗?

    自从 Karakters 是一个数组列表,那么为什么不只是有一个方法 getRace(int position) 这样你就可以找到感兴趣的人的种族。

    我看不出获得一个阵列的竞争有什么意义。

        3
  •  2
  •   Aaron Digulla    16 年前

    这真的没有道理。如果你有一个数组列表,那么你可以打电话给 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
        }
    }
    
        4
  •  1
  •   Murali VP    16 年前

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

        5
  •  1
  •   Andrzej Doyle    16 年前

    只要可以从当前类访问实现该方法的对象,就可以对该对象调用该方法。尤其是,因为 getRace 方法是公共的,任何类只要具有适当的 Orc Human 打开电话。

    我想你的症结在于你有一份 Karakter 而不是兽人或人类。因此 Karakters 只知道在那一点上,物体是 卡拉克特 ,因此只能调用 卡拉克特 类/接口。

    一种解决方案是添加 地球跟踪 方法到 卡拉克特 也要上课。如果在超类中返回一个值没有意义,那么可以使超类 摘要 (这意味着您不能直接构造它的一个实例,您只能构造它的一个子类),并声明该方法 摘要 在里面 卡拉克特 也是:

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

    这强制子类实现 地球跟踪 (这里没问题,反正他们也一样)意思是 卡拉克 现在可以 当然 不管怎样 卡拉克特 对象,有一个getrace()方法要调用。

    这只是基于我理解您的意图的解决方案的一种方法。但根本问题是 卡拉克特 类没有定义 地球跟踪 ,因此无法调用该方法 直接地 关于该类型的引用。

        6
  •  1
  •   bruno conde    16 年前

    你可以在 运行时 具体的类型是什么 Karakter 并强制转换为适当的子类型。

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

    而且,看起来你可以 俯卧撑 方法 getRace() 进入之内 卡拉克特 ,如果它对 卡拉克特 有一个 GeTrace() .

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

    如果它对 卡拉克特 拥有 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<Karakter> .