【问题标题】:know type of inheritance知道继承类型
【发布时间】:2015-04-11 20:51:57
【问题描述】:

如果我有一个像这样的继承类

class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}

我怎么知道是哪一类? (我的意思是,如果想知道下面的一个对象是狗还是猫)

我有一个ArrayListAnimals,其中包含Cats 和Dogs。我将此信息保存在一个文件中,以供以后加载信息。但问题是当我想加载我需要知道类的类型的信息时,用于调用狗或猫的构造函数(猫和狗有不同的构造函数参数)。

所以我的解决方案之一是存储对象的类型,以便在我加载信息时调用正确的构造函数。有没有更好的解决方案?

【问题讨论】:

标签: java inheritance


【解决方案1】:

我想你想重新实现 java 的序列化。 而不是那个

  1. 你应该让 Animals 类实现 Serializable 标记接口
  2. 简单的写入然后从文件中读取你的数组like described here

【讨论】:

    【解决方案2】:

    由于您正在保存信息,因此您还可以打印出类型。

    例如,您可以使用以下内容:

    for (final Animals animal : myAnimalList){
        output.print(animal.getClass().getSimpleName());
        output.println(animal.getData());
    }
    

    对于Dog 的实例,这将打印出"Dog",对于Cat 的实例,它将打印出"Cat"。其次是getData() 信息。这是假设getData() 将包含用于打印信息的适当数据。

    然后你可以实现类似:

    Dog[name=Ruff, age=17, favoriteToy=Ball]
    Cat[name=Tom, age=102, hates=Everyone]
    

    然后,您可以根据必填字段轻松填写重建狗和猫所需的信息。

    话虽如此,您可以将其写入文件。正如您在问题中所建议的那样,这类似于您已经这样做的方式。

    以前已经做过,所以不建议创建自己的方法。


    另一种方法是为每个类设置一个唯一标识符(想想serialVersionUID)。

    这只是Serialization 的一种形式。有了基本的readwrite 方法,就可以在类到类的基础上处理正确的数据。

    最好为Animals 类实现Serializable,然后将您不想写入和读取的字段发送到transient

    然后,您可以使用这些签名填充所有适当的方法:

    private void writeObject(java.io.ObjectOutputStream out) throws IOException
    private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
    private void readObjectNoData() throws ObjectStreamException;
    

    【讨论】:

    • Java 的默认序列化程序有什么问题?您无需关心任何标识符,它自己处理整个过程。
    • @CommuSoft 什么都没有,这就是为什么我说创建你自己的不是一个好主意,你应该使用序列化程序......
    【解决方案3】:

    getClass() 为例:

    Animal dog = new Dog();
    if (dog.getClass().equals(Dog.class)) {
        System.out.printf("Its dog!");
    }
    

    或者正如 Beko 指出的那样

    Animal dog = new Dog();
    if (dog instanceof Dog) {
        System.out.printf("Its dog!");
    }
    

    【讨论】:

    • 首先,.getClass()instanceof 的行为不同,BlackDog extends Dog 的类将失败第一个 if 并成功第二个,此外,使用此类测试通常是糟糕的设计。
    • @ChiefTwoPencils:这个问题很模糊。目前尚不完全清楚 OP 是否编写了某种解析器,将文件解析为 ArrayList,但是如果希望对 Cats 和 Dogs 执行不同的操作,则应该使用虚拟方法。如果希望从文件中存储/加载文件,Java Serializer 是最好的选择。
    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-06
    • 1970-01-01
    • 2010-11-08
    • 2013-02-03
    相关资源
    最近更新 更多