嗨,谢谢你花时间看看我的问题。
我正在尝试在对象数组中保存的对象上调用方法。
有三类:卡片,卫兵和甲板。
Guard类扩展了Cards类。
数组的类型为“Cards”,并在Deck类中实例化。
卡片类几乎是空的:
public class Cards {
}
存储在数组中的对象是Guard类型。这是Guard类及其状态和方法:
public class Guard extends Cards{
private int cardScore = 2;
private String cardName = "Guard";
private String cardAbility = "this is the guard's ability";
public void printGuardInfo()
{
System.out.println("This card score fo the guard is: "+cardScore);
System.out.println("The card name is: "+ cardName);
System.out.println("The card ability is" + cardAbility);
}
}
我在Deck类中实例化数组。然后我用Guard类型的对象填充一系列类型的卡片。我相信这是多态的。
这有效,我可以打印每个索引点保存的参考变量。
public class Deck {
Cards[] deck = new Cards[16];
public Cards[] getDeck() {
return deck;
}
public void addGuards()
{
for(int i=0; i<5; i++)
{
deck[i] = new Guard();
deck[i].printGuardInfo();// Error: cannot resolve method printGuardInfo()
}
}
}
我的问题是我现在无法在deck [i]上调用printGuardInfo()方法。
我已经搜索并搜索了一段时间,但没有成功。我觉得我需要一个接口或某种抽象类。不幸的是,我在这些领域的知识不足。
非常感谢任何帮助,谢谢。
答案 0 :(得分:5)
让Cards
成为interface
public interface Cards {
void print();
}
让Guard
实现此接口并使用所需信息覆盖print
方法。
public class Guard implements Cards{
// ... Other methods and stuff
@Override
public void print() {
System.out.println("This card score fo the guard is: "+cardScore);
System.out.println("The card name is: "+ cardName);
System.out.println("The card ability is" + cardAbility);
}
// ... Other methods and stuff
}
现在在循环中你只需要调用
deck[i].print();
现在打印的内容取决于必须打印的内容的实际执行情况,但通常情况下,Cards
课程会知道它现在可以print
。
修改:在@chrylis评论后,您的班级应该被称为Card
,而不是Cards
。这里的原因?这就像是单一类型的Card
(此处为类)的简单计划,但不代表多个Cards
(多个卡将是Card
的实例)。
答案 1 :(得分:3)
虽然一些建议的解决方案在狭义的情况下有意义(使用instanceof
的组合并将受影响的Cards
元素投射到Guard
以调用printGuardInfo
),继承的设计可能存在更广泛的问题。
假设Cards
实际上不是一个空类(否则层次结构确实没有产生任何好处),我的建议是将您的卡对象分组到一个公共接口或抽象类(例如Card
),并让该接口为printInfo
等一般方法提供抽象,然后由每个Card
类型实现(您将在printGuardInfo
中获得Guard
代码那里实施)。
反过来,在迭代你的数组时,你会在每张卡上调用printInfo
,知道Card
的每个孩子都有自己的printInfo
实现,而不需要施放或使用instanceof
。
答案 2 :(得分:2)
您需要将Card
转换为Guard
:
((Guard) deck[i]).printGuardInfo();
答案 3 :(得分:2)
最简单,最面向对象的方法是将printGuardInfo
更改为toString
:
public String toString()
{
return new StringBuilder("This card score fo the guard is: ")
.append(cardScore).append('\n')
.append("The card name is: ")
.append(cardName).append('\n')
.append("The card ability is ")
.append(cardAbility)
.toString();
}
然后,您可以调用String guardInfo = deck[i].toString();
获取保护信息并将其写入标准输出,记录器等。
public String toString()
继承自Object
,因此无需转换即可调用它。
答案 4 :(得分:2)
R2-D2是对的,但是如果你想要更多'多态',你应该做类似这样的事情
public interface ICard {
public void printInfo();
}
public class Card implements ICard{
public void printInfo(
System.out.println("Card Info");
}
}
public class Guard extends Card {
public void printInfo{
System.out.println("GUARD Info");
}
}
public vlass Deck{
...
public void addGuards()
{
for(int i=0; i<5; i++)
{
deck[i] = new Guard();
deck[i].printInfo();
}
}
}
甚至使用抽象类