我在互联网上找到了以下代码,这可能是一个简单的问题,但您的解释对我很有帮助。
这是名为SongComponent的抽象类
public function addarray($arrayname, $array = array()) {
$this->$arrayname = array_merge($this->$arrayname, $array);
}
这是扩展名为SongGroup
的抽象类的类public abstract class SongComponent {
public void add(SongComponent newSongComponent){
throw new UnsupportedOperationException();
}
public void remove(SongComponent newSongComponent){
throw new UnsupportedOperationException();
}
public SongComponent getComponent(int componentIndex){
throw new UnsupportedOperationException();
}
public String getSongName(){
throw new UnsupportedOperationException();
}
public String getBandName(){
throw new UnsupportedOperationException();
}
public int getReleaseYear(){
throw new UnsupportedOperationException();
}
public void displaySongInfo(){
throw new UnsupportedOperationException();
}
}
我的问题是,在什么情况下,将调用add()方法和已被覆盖的抽象类的其他方法?例如,当调用导致抛出新的UnsupportedOperationException的抽象类的方法add()时?
答案 0 :(得分:3)
SongComponent
可能有其他具体的子类(SongGroup
除外)不会覆盖add()
。对于这样的子类,调用add()
将执行基类实现并抛出UnsupportedOperationException
异常。
SongComponent
的另一种实现方法是使当前抛出UnsupportedOperationException
的所有方法都是抽象的,这会强制SongComponent
的任何具体子类覆盖它们。
答案 1 :(得分:2)
您可以在子类中调用其中一个重写的类,例如致电super.add()
。因为这将引发UnsupportedOperationException
我不建议这样做。
如果你有另一个子类,例如
class SongWithNoComponents extends SongComponent{
...
}
你没有覆盖add()
那里,抛出UnsupportedOperationException
,这在这种情况下是有意义的,因为这个子类不支持添加其他SongComponents
。
答案 2 :(得分:1)
在您的特定情况下,永远不会调用抽象版本。但是您可以创建另一个不覆盖add()
的子类,这些子类将回退到抽象版本。你也可以有一个在重写方法中调用super.add()
的子类。
答案 3 :(得分:1)
请记住,抽象类无法实例化,但可以调用。有关几乎完全重复的问题,请参阅link
我希望这会有所帮助。
答案 4 :(得分:1)
SongComponent
的任何子类,不会覆盖add,remove
方法等,将获得UnsupportedOperationException()
。
在您的示例中,SongGroup
实现(覆盖)父类SongComponent
的这些方法,并且它不会获得这些异常。如果您再实施一个课程SongGroup2
,SongComponent
扩展UnsupportedOperationException()
不会覆盖这些方法,则会获得node_modules/jquery-ui/jquery-ui.js