gpt4 book ai didi

java - 未调用子类中的方法(正确)

转载 作者:行者123 更新时间:2023-11-30 10:44:33 29 4
gpt4 key购买 nike

我有一个类“FileButton”。它的目的是将文件链接到 JButton,FileButton 继承自 JButton。子类继承自此以使用链接到按钮的文件做有用的事情。

JingleCardButton 类是这些子类之一。这个子类有一个方法可以在使用方法“playSound()”单击按钮时播放链接到 JingleCardButton 的铃声。此方法在继承自 FileButton

的其他子类中不可用

此外,我还有一个类 Card,它在指定的 JPanel 上维护一个 FileButton 对象的网格。 JingleCard 类继承自 Card 并维护 JingleCardButton 对象。

由于每种Card 都需要存储其所有内容,因此在基类Card 中声明了二维buttonGrid 数组。

   protected FileButton[][] buttonGrid; //the 2d area containing all FileButton objects is declared in "Card". 

这是JingleCard中的构造函数

  public JingleCard(JPanel p, int xdim, int ydim, JToggleButton editButton) {
super(p,xdim,ydim,editButton); // calling the constructor in Card
buttonGrid= new JingleCardButton[xdim][ydim];
for (int row= 0; row< xdim; row++) {
for (int column= 0; column< ydim; column++) {
buttonGrid[row][column] = new JingleCardButton(null);
buttonGrid[row][column].addActionListener(this);
p.add(buttonGrid[row][column]);
}

p.doLayout();
}
p.doLayout();
}
}

现在我有一个 JingleCard,一个充满 JingleCardButton 的二维数组。使用 GUI 将 mp3 文件添加到按钮后(创建卡片时没有自动链接的文件)。

现在我应该能够(我认为如此)播放分配给 JingleCardButton 的 gui 的 clang ,该按钮位于 JingleCard 的 ButtonGrid .

buttonGrid[row][column].playSound(); //syntax to play the sound is just like here: instance_of_JingleCardButton.playSound(); 

我不知道为什么,但是在 Netbeans 中编译时,这会产生错误...根据 Netbeans 的说法,在类 中找不到方法 PlaySound()文件按钮。 (没错,因为它在子类 JingleCardButton 中)。

是什么导致了这个问题?我确定 buttonGrid 包含 JingleCardButton 对象,并且调用 playSound() 应该有效。我看不出出了什么问题。

(提到的一些类还实现了 ActionListener en Serializable)

最佳答案

您的 buttonGrid 是一个 FileButton 数组,因此编译器将数组中的每个项目视为 FileButton 类型。现在,即使您用 JingleCardButton 对象填充数组,Java 编译器也只允许您对数组中的项目调用 FileButton 方法。您可以通过认为由于 Java 无法知道稍后您可能不会使用不同子类型的 FileButton 对象切换数组中的项目来理解基本原理,因此它必须在安全和限制方面犯错你可以用那个变量做什么。

一种可能的解决方案是使用 instanceof 运算符检查变量持有的类型对象,然后将变量转换为 JingleCardButton 的类型

if (buttonGrid[row][column] instanceof JingleCardButton) {
((JingleCardButton) buttonGrid[row][column]).playSound();
}

...但这会导致脏代码,即脆弱且容易损坏的代码。

更好的做法是甚至不要对 JButton 进行子类型化,因为您似乎不想更改 JButton 的固有属性,而是想要更改其按下时的行为。此行为不是由按钮本身决定的,而是由它设置的 Action 或添加的 ActionListeners 决定的。出于这个原因,我强烈建议您创建扩展 AbstractAction 而不是 JButton 的类,除非您希望修改其他 JButton 行为,即与其 Action 监听器行为无关的行为。

关于java - 未调用子类中的方法(正确),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37379741/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com