3

Java で次のクラスをモデル化したいと思います。

ここに画像の説明を入力

だから私は次のコードを持ってきました:

class Person
{
    private String name;
    private ing age;
    public Person(String name, int age){
        this.name=name;
        this.age=age;
    }
    //set and get methods
}

class Employee
{
    private String nameEmp;
    private double salary;
    public Employee(String nameEmp, double salary){
        this.nameEmp=nameEmp;
        this.salary=salary;
    }
    public double calcSalary(){}   //should this be an abstract method?
}

class Teacher extends Person implements Employee
{
    private String nameTeacher;
    private int ageTeacher;
    private String title;   //professor or lecturer
    public Teacher(String nameTeacher,int ageTeacher, String title){
        super(nameTeacher,ageTeacher);
        this.title=title;
    }
    public double calcSalary(){
        if (title.equals("Professor")) salary=salary*0,30;
        else if (title.equals("Lecturer")) salary=salary*0,10;
    }
}

インターフェイスを使用してモデル化したいのですが、その方法がよくわかりません。また、calcSalary は Employee の抽象メソッドである必要がありますか? Javaのインターフェースでこれをどのように実装できますか?

ありがとう

4

5 に答える 5

4

いいえ、この方法ではできません。Teacher is -> Employee is -> Person を選択する必要があります。インターフェイスには何も実装できません! インターフェイスには、クラスによって実装する必要があるメソッドのみを含めることができます。

于 2013-06-04T14:31:46.643 に答える
3

あなたはこれを持つことができます:

public interface Person{
    // Only abstract methods here
}

public interface Employee extends Person {
    // Only abstract methods here specific to Employee
}

public class Teacher implements Employee {
    //Implements the methods 
}
于 2013-06-04T14:34:30.450 に答える
2

Java 8 では、インターフェイスにデフォルトの実装を配置できます。それまでは、インターフェースに実装を含めることはできません。

于 2013-06-04T14:29:54.807 に答える
0

人物から始めます。そこにタイプミスがありました:

public class Person
{
    private String name;
    private int age;
    public Person(String name, int age){
        this.name=name;
        this.age=age;
    }
    // set and get methods, equals, hashCode, toString,
    // perhaps an id for database storage.
}

さて、いくつかPersonの s はEmployees です。その他は、学生、保護者、入学希望者などです。のいずれかのメソッドにEmployee実装がある場合、それをインターフェイスにすることはできません。いずれにせよ、 でnameEmp名前が重複するため、持つことは間違っていPersonます。クラスに混在する Employee のインターフェイスを作成するか、Teacherから継承しEmployeeます。

また:

public interface Employee {
    // Currency values should use BigDecimal or BigInteger, not double.
    BigDecimal salary();
    // Taxpayer Identification Number (SSN) in the USA, or the equivalent outside.
    String taxNumber();
}

また:

public class Employee extends Person {

    private BigDecimal salary;
    private String taxNumber;
    public Employee(String name, int age, BigDecimal salary,
                    String taxNumber) {
        super(name, age);
        this.salary = salary;
        this.taxNumber = taxNumber;
        this.title = title;
    }
    // getters, setters, etc.
}

public class Teacher extends Employee {
    private Department department;
    private List<Course> courses = new ArrayList<>();
    // Constructors, getters, setters, etc.
}

まったく異なる実装が必要な場合にのみ、教師に給与メソッドを含める必要があります。代わりに、従業員クラスに何らかの給与計算クラス (Strategy パターン) が必要になる場合があります。このようにして、課税控除、保険、年金制度、必要に応じて残業を処理できます。元の例の乗数がわかりませんでした。

于 2013-06-04T16:30:15.900 に答える