如何调用子类的方法?

时间:2015-05-28 08:17:37

标签: java oop

我有一个像这样的超类:

public class GenericUpdate{

//...other stuff...

public String getName(){return null;};

}

这样的子类:

public class FromFriend extends GenericUpdate {

@Override
public String getName() {return getFriend().getName();}

}

或者这个:

public class FromArtist extends GenericUpdate {

@Override
public String getName() {return getArtist().getName();}

}

现在,

其他一些课程向我提供了GenericUpdate

的列表

如果我在列表上进行迭代并致电GenericUpdate.getName()我从getName()

返回 null

是否有一个很好的解决方案来避免这种情况?

由于

编辑编辑编辑编辑

从Android Intents中检索GenericUpdate类的实际实例,它们的检索方式如下:

    genericUpdate=intent.getParcelableExtra(GENERIC_UPDATE);

他们被置于这样的意图中:

GenericUpdate genericUpdate=((FlowAdapter)parent.getAdapter()).getItem(position);    
//...                        
intent.putExtra(PostDetailActivity.GENERIC_UPDATE,genericUpdate);
//...

3 个答案:

答案 0 :(得分:2)

也许你需要界面?

public interface GenericUpdate{

//...other stuff...

public String getName();

}

public class FromFriend implements GenericUpdate {

@Override
public String getName() {return getFriend().getName();}

}

或者这个:

public class FromArtist implements GenericUpdate {

@Override
public String getName() {return getArtist().getName();}

}

然后没有人可以在列表中添加一个非有效对象,如果你有一个实现这个接口的对象实例,那么应该总是有一个有效的实现方法。

接口角色就是告诉别人他们应该实现什么,所以你可以使用一些使用这种实现它的对象的抽象算法。

你不能实例化纯粹的界面,你需要实现它,这保证你,每个对象都有实现,应该是有效的。

答案 1 :(得分:2)

从上面的语句中,类GenericUpdate有一个返回null的方法getName()。如果您正确观察,也可以实例化此类。因此,如果您有GenericUpdate个类的列表,它们将始终返回null,因为getName()方法始终返回null

如果您不希望实例化Generic类,可以执行以下操作:

public abstract class GenericUpdate{
    public abstract String getName();
}

然后,您现在可以按照自己的方式扩展课程。 现在,要使用GenericUpdate' getName()方法,您必须执行以下操作:

GenericUpdate fromFriend = new FromFriend();
fromFriend.getName();

只要实现中的getFriend().getName();方法具有值且不为null,就不会为GenericUpdate返回null。

另一种选择是使用Krzysztof Cichocki上面的答案。

答案 2 :(得分:2)

Java中的所有方法都是virtual,因此您无法意外地"在子类的对象上调用基类方法。

要查看列表中对象的运行时类型,您可以打印genericUpdate.getClass().toString()

如果此项提供class com.mypackage.javaclasses.FromFriend,那么getFriend.getName()很可能会返回null。如果这给了class com.mypackage.javaclasses.GenericUpdate你的对象不是正确的子类型,那么getName的子类实现就不会被调用就不足为奇了。

(在这种情况下,原来是后者。)

因此,如果您可以控制GenericUpdate类的代码,则可以通过使GenericUpdate抽象来确保避免这种情况。 (请注意,抽象类仍然可以包含字段。)