Java的继承应该是怎样的?

Java的继承应该是怎样的?,java,Java,目前我有管理类,用户类和讲师类。然后我希望user和讲师从user继承。但问题是我的用户类构造函数是关于用户名、密码的,但我把管理员和讲师类构造函数和他们的个人资料放在一起,比如他们的姓名、年龄、性别等等?因此,讲师和管理员与用户类不同。那么我在这方面有什么问题吗?实现目标的方法不止一种。这里有一个: //base class abstract class User { User(String name, int age, ...) { } } class Authentica

目前我有管理类,用户类和讲师类。然后我希望user和讲师从user继承。但问题是我的用户类构造函数是关于用户名、密码的,但我把管理员和讲师类构造函数和他们的个人资料放在一起,比如他们的姓名、年龄、性别等等?因此,讲师和管理员与用户类不同。那么我在这方面有什么问题吗?

实现目标的方法不止一种。这里有一个:

//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继承。我想通过构造函数传递初始值,如问题中所示。在复制两个子类中相同的字段而不是将它们移动到超类中之前,我也会三思而后行。