繁体   English   中英

在一个超类集合中循环遍历不同对象(扩展了公共超类)

[英]looping over different objects (that extends common super class) in one collection of superclasses

我在Java中为继承而苦苦挣扎。 我有许多具有相似属性的元素,例如fe idnamedate 此元素还指定了仅属于它们的参数,例如: 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中有很多类似的继承问题。 我不知道如何进行下去? 如何实现类,使它可以工作。

您能给我一些好的Design Pattern或线索吗?

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

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

然后,您的打印方法变为:

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

每个类都知道其String表示应如何。 例如,在User类中:

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

编辑:

如果您希望从类型为超类的变量访问子类的成员(例如,从Person变量访问email属性),则必须首先将变量转换为子类的类型(您的示例中的用户),并确保此强制转换有效(例如,使用instanceof验证该person instanceof User )。

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

因此,让我们看看您的代码。 您的集合可以具有所有扩展Person本身的类的对象。 这意味着,可能存在某些“人的对象”,“某些用户”等等。 集合本身不能真正确定它包含某个类的哪些对象。 我们可以看到您的超类人员没有电子邮件属性。 只有用户类具有(以及可能从其扩展的所有类)。 因此,在“超人”对象的对象上,仅由于它没有该成员,就无法从“电子邮件”属性接收数据。 即使无法在子类中使用基本类型人员的集合,也无法访问该属性电子邮件,因为无法确保该调用不会对可能放入集合中的所有对象都失败。

可能有哪些解决方法:

  • 最简单,不要尝试访问集合的基本类型中不存在的成员
  • 如上所述,在类中定义toString()方法。 然后,您可以在Class用户的Objects中看到成员电子邮件的值。
  • 如果您知道您的集合本身仅包含用户对象,则只需更改bastype
  • ClassX instanceof ClassY返回true或false取决于ClassX是ClassY的子类。 因此,您可以将其放在if语句中。 如果某事是用户的实例,那么您可以毫无问题地访问会员电子邮件。 但是,请记住在if语句的主体中强制转换为User。

在编程中,很少有一种适合所有人的尺寸。 IMO甚至没有设计模式。 在您的情况下,我会执行以下操作:

for(Person person: this.persons) {
   if (person typeof User) 
      System.out.println(person.id + " " + ((User)person).email);
}

希望其他人能提出一些更好的建议:-)

那很简单。 email是User not Person的成员。因此您无法编译此代码。

从用户删除电子邮件,并将其添加到Person类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM