[英]Looping through a list of different objects that share the same super class and get one specific type
[英]looping over different objects (that extends common super class) in one collection of superclasses
我在Java中为继承而苦苦挣扎。 我有许多具有相似属性的元素,例如fe id
, name
或date
。 此元素还指定了仅属于它们的参数,例如: email
, address
。
我想将这些不同的元素保留在集合中。 然后使用循环在控制台中显示它们。 但是,当我放置诸如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本身的类的对象。 这意味着,可能存在某些“人的对象”,“某些用户”等等。 集合本身不能真正确定它包含某个类的哪些对象。 我们可以看到您的超类人员没有电子邮件属性。 只有用户类具有(以及可能从其扩展的所有类)。 因此,在“超人”对象的对象上,仅由于它没有该成员,就无法从“电子邮件”属性接收数据。 即使无法在子类中使用基本类型人员的集合,也无法访问该属性电子邮件,因为无法确保该调用不会对可能放入集合中的所有对象都失败。
可能有哪些解决方法:
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.