java - 在一个父类(super class)集合中的不同对象(扩展公共(public)父类(super class))上循环

标签 java inheritance design-patterns

我在java中的继承方面遇到了困难。我有许多具有类似属性的元素,例如 f.e. id名称日期。这些元素还指定了仅属于它们的参数,例如:emailaddress

我想将这些不同的元素保留在集合中。然后使用循环将它们显示在控制台中。但是当我放置像 email 这样的元素(为具体类 User 指定)时,它会给我一个错误:

value email is not a member of Person

这里是代码:

public class Person {
  int id;
  String name;
  Date date;
}
public class User extends Person {
  String email;
  String login;
  String password;
}
public class Contact extends Person {
  Address address;
}

public class Customer {
  List<Person> persons;

  // AND NOW I WOULD LIKE TO PRINT THIS
  public void print() {
    for(Person person: this.persons) {
      System.out.println(person.id + " " + person.email);
    }
  }
}

我在 Java 中的继承方面遇到了很多类似的问题。我不知道如何继续下去?如何实现类(class),我可以让它发挥作用。

你能给我一些好的设计模式或线索吗?

我正在寻找一些先进的东西,这将使我能够使用仅在扩展类中出现的参数。我想通过参数名称来调用它们。 我已经尝试为每个扩展类实现 print 方法,但它是通用的。我必须有权访问参数。

最佳答案

你的具体例子很容易解决。为了打印类的对象,请重写该类的 toString。

然后你的打印方法变成:

  public void print() {
    for(Person person: this.persons) {
      System.out.println (person);
    }
  }

每个类都知道其字符串表示形式应该是什么样子。例如,在 User 类中:

public class User extends Person
{
    @Override
    String toString ()
    {
        return this.id + " " + this.email;
    }
}

编辑:

如果您希望从类型为父类(super class)的变量访问子类的成员(例如从 Person 变量访问电子邮件属性),则必须首先将该变量转换为子类的类型-class(示例中的 User),并确保此转换有效(通过使用 instanceof 来验证,例如 person instanceof User)。

有时无法避免这样的强制转换,但过多的强制转换通常表明您的设计存在缺陷。当您处理人员集合时,应避免访问仅在某些子类中定义的特定属性。您应该尝试仅调用 Person 类的方法,并且可以在子类中重写这些方法以提供不同的行为。

关于java - 在一个父类(super class)集合中的不同对象(扩展公共(public)父类(super class))上循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30571437/

相关文章:

java - 将虚拟文件作为 MultipartEntity 发送

c++ - 调用父虚函数

java - 泛型类继承

algorithm - 规则引擎算法解决什么问题?

java - 设计模式-多观察者

java - 在 Java 中比较输入数据和 Sql 表的有效方法

java - 使用 Canvas 正确绘制点

java - 如何解释转义字符的用户输入?

python - python 2.7 中的继承

javascript - 如何在javascript中实现访问者模式?