在父类java中循环时获取子类
我正在循环浏览我的媒体arraylist arraylist,它有一些子类音频、视频、图片 当我循环浏览我的媒体阵列列表时在父类java中循环时获取子类,java,Java,我正在循环浏览我的媒体arraylist arraylist,它有一些子类音频、视频、图片 当我循环浏览我的媒体阵列列表时 public double getTotalVideoRunTime() { int total = 0; for(Media v : mList) { if(v.isVideo()) { } } return t
public double getTotalVideoRunTime()
{
int total = 0;
for(Media v : mList)
{
if(v.isVideo())
{
}
}
return total;
}
我不知道如何从video类中获取变量“runtime”,是否必须以不同的方式循环?我不确定如何从子类中获取变量,我假设这是可能的,但愿如此 必须使用instanceof并将其强制转换为正确的类
e、 g
不完全确定您想要实现什么,但如果您想要某个类具有的变量,您可以使用: 类似地,如果需要这些方法:
Method[] methods = v.getClass().getMethods()();
for (Method m : methods) m.invoke(arguments...);
我必须警告您,使用反射有很多缺点—性能、安全性—很多时候,如果您需要使用反射,它表明了一个错误
如果您试图为某个类执行某些特定行为,正确的方法是将其实现为抽象方法,并调用它-将选择动态类型,并调用所需的方法:
public abstract static class Media {
abstract public void foo();
}
public static class Video extends Media{
@Override
public void foo() {
System.out.println("video");
}
}
public static class Image extends Media{
@Override
public void foo() {
System.out.println("image");
}
}
public static void main(String ar[]) {
Media m = new Video();
m.foo();
}
我认为他只是想访问子方法。抽象类是如何解决这种情况的?他有一个包含子类的列表,其中可能包含特定于子类的方法。@MuratK。您可以捕获接口/抽象类中的常见行为,并让具体实现处理这些差异。这正是抽象方法的作用。是的,我理解。但在这种情况下,他在ArrayList中拥有所有对象,而您不知道对象是否具有具体方法。@MuratK。通过定义媒体的抽象方法,您可以强制每个实现类实现该方法。这就是重点。将列表声明为列表可以确保每个对象都有它的实现。您希望实现什么?是否要调用特定的方法?在这种上下文中使用instanceof是一种巨大的代码气味。@amit为什么会这样?@MuratK。这就像一个大的if/else块或类似开关:如果您忘记保持它的最新状态,那么这个代码就被破坏了。在这里使用多态性会更好。事实上,您调用chileMethodOfVideo和childMethodOfAudio,而不是childMethod的具体实现(由媒体声明并由视频和音频覆盖),这是一种代码味道。它的处理更加优雅、高效,并且更易于使用和维护polymorphism@amit作为一个例子,视频可以播放,图像可以打印,他在开篇文章中写道,这个类是存在的。你怎么可能在这里使用多态性而不是instanceof?
Method[] methods = v.getClass().getMethods()();
for (Method m : methods) m.invoke(arguments...);
public abstract static class Media {
abstract public void foo();
}
public static class Video extends Media{
@Override
public void foo() {
System.out.println("video");
}
}
public static class Image extends Media{
@Override
public void foo() {
System.out.println("image");
}
}
public static void main(String ar[]) {
Media m = new Video();
m.foo();
}