Java的继承应该是怎样的?
目前我有管理类,用户类和讲师类。然后我希望user和讲师从user继承。但问题是我的用户类构造函数是关于用户名、密码的,但我把管理员和讲师类构造函数和他们的个人资料放在一起,比如他们的姓名、年龄、性别等等?因此,讲师和管理员与用户类不同。那么我在这方面有什么问题吗?实现目标的方法不止一种。这里有一个:Java的继承应该是怎样的?,java,Java,目前我有管理类,用户类和讲师类。然后我希望user和讲师从user继承。但问题是我的用户类构造函数是关于用户名、密码的,但我把管理员和讲师类构造函数和他们的个人资料放在一起,比如他们的姓名、年龄、性别等等?因此,讲师和管理员与用户类不同。那么我在这方面有什么问题吗?实现目标的方法不止一种。这里有一个: //base class abstract class User { User(String name, int age, ...) { } } class Authentica
//base class
abstract class User {
User(String name, int age, ...) {
}
}
class AuthenticatedUser extends User {
AuthenticatedUser(String name, int age..., String username...) {
super(name, age, ...);
//authentication setup next
}
}
class SystemUser extends User {
//etc etc
}
我猜您希望将用户属性同时继承给admin和讲师类。 因此,您需要在这里扩展基类用户
public class User {
private String username;
private String password;
public User(){
}
}
class Admin extends User{
private String name;
private Integer age;
private String gender;
public Admin(){
// Constructor code here
}
}
class Lecturer extends User{
private String name;
private Integer age;
private String gender;
public Lecturer(){
// Constructor code here
}
}
若要将类管理员(Admin)和讲师(讲师)定义为用户(User),那个么可以让类管理员和讲师从用户继承。但若类管理员和讲座不依赖于“用户名、密码”,那个么从用户类扩展就并没有意义了。这里有一个替代方案:
public interface User {
}
public class UserImpl implements User {
private final String username;
private final String password;
public UserImpl(String username, String password) {
this.username = username;
this.password = password;
}
}
public class Admin extends UserGroupAdmin implements User {
protected Admin(String name, int age, String gender) {
super(name, age, gender);
}
}
public class Lecturer extends UserGroupAdmin implements User {
protected Lecturer(String name, int age, String gender) {
super(name, age, gender);
}
}
为公共部分创建一个额外的抽象类:
public abstract class UserGroupAdmin {
private final String name;
private final int age;
private final String gender;
protected UserGroupAdmin(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getGender() {
return gender;
}
}
关于何时和何时不继承的额外阅读:“利斯科夫替代原则”:
我不太确定这里的问题是什么。如果你问“我的代码会编译吗”,试试看。如果你问“我的代码不工作,我该如何修复它”,我们需要看一个来帮助你。@CharlieArmstrong他问的更多的是一个类建模问题。我只是在编写program@AmirAfghani我明白了,我只是在努力理解问题是什么。问题中的英语有点难理解,至少对我来说是这样,我认为一些代码可能会澄清一些事情。我仍然认为,如果OP为未来读者添加了它,这会澄清这个问题。你的描述听起来不错,如果你不想公开无参数构造函数,你只需要使用
super(用户名、密码)
作为讲师和Admin
构造函数的第一行。你真的应该包括你的代码。事实上,我不明白你写的是什么。你能解释一下吗?你不明白什么?虽然管理员和讲师没有用户名和密码的使用,我们也可以让管理员和讲师从用户继承?如果他们没有从用户继承的东西,那么我不会从他们继承。继承是一种“isa”关系。除非你能声明A是B,否则A通常不应该从B继承。我想通过构造函数传递初始值,如问题中所示。在复制两个子类中相同的字段而不是将它们移动到超类中之前,我也会三思而后行。