我在java中的继承方面遇到了困难。我有许多具有类似属性的元素,例如 f.e. id
、名称
或日期
。这些元素还指定了仅属于它们的参数,例如: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 中的继承方面遇到了很多类似的问题。我不知道如何继续下去?如何实现类(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/