[英]How to use a method from a class in another class without extending
对不起,如果我的问题听起来很奇怪,我会试着解释一下。 我有4个班:Karakter,Karakters,Orc,Human。 兽人和人类都延伸了卡拉克特。 Karakters是一个带有Karakter的ArrayList。
我在Orc和Human中都有一个方法叫做:public String getRace()。 现在我想在Karakters中使用这种方法?!! 当我尝试这样做时,它失败了,因为Orc和Human扩展了Karakter而不是Karakters! 有没有办法做到这一点? 我听到了一些关于制作抽象的东西:P
谢谢
声明getRace()
的方法Karakter
(注意,英文拼写是“字符”,但那是不伦不类)。
由于Karakters
只知道它在处理类型的对象Karakter
,它无法知道两个实现有getRace
方法。 在基类中声明方法可以解决此问题。
它应该如下所示:
public abstract String getRace();
而Karakter
课程也必须是abstract
。
当你打电话给Karakters.getRace()
时,你会发生什么?
由于Karakters
是一个ArrayList,为什么不只是有一个方法getRace(int position)
这样你就可以找到感兴趣的人的种族。
我不知道如何让阵列的竞争变得有意义。
这没有多大意义。 如果你有一个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
}
}
要调用Orc或Human中定义的getRace(),您需要一个Orc或Human对象或其派生类之一(假设该方法在base中不是私有的)。 当然,如果getRace()是public static,那么您可以使用类名从任何地方调用它。
您可以在运行时测试什么是Karakter
的具体类型并转换为适当的SubType。
for(Karakter k : karakters) {
if (k instanceof Orc) {
((Ork)k).getRace();
} else if (k instanceof Human) {
((Human)k).getRace();
}
}
此外,它看起来像你可以在方法推 getRace()
到Karakter
,如果它是有道理的,一个Karakter
有getRace()
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
。 别。 支持Composition over Inheritance,并始终使用ArrayList<Karakter>
的通用版本。
您可以在实现该方法的对象上调用该方法,只要可以从当前类访问它即可。 特别是,由于getRace
方法是公共的,所以任何类都可以调用它,只要它们具有适当的Orc
或Human
实例来调用它。
我希望你的关键点是你有一个Karakter
的名单,而不是兽人或人类。 因此, Karakters
只知道该对象是一个Karakter
,因此只能调用Karakter
类/接口中定义的方法。
一个解决方案是将添加getRace
方法将Karakter
类为好。 如果在超类中返回一个值没有意义,那么你可以使超类抽象 (这意味着你不能直接构造它的实例,你只能构造它的一个子类),并声明方法Karakter
摘要也是:
public abstract class Karakter
{
/*
...
... Same as before
...
*/
public abstract String getRace();
}
这迫使子类有一个getRace
的实现(这里不是问题,因为它们无论如何都是这样)并且意味着Karakters
现在可以确定无论它有什么类型的Karakter
对象,都有一个getRace()方法打电话。
这只是基于我理解您的意图的解决方案的一种方法。 但根本的问题是, Karakter
类没有定义getRace
,所以该方法不能直接在该类型的引用调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.