QA@IT
«回答へ戻る

回答を投稿

以下のようにすれば動作するようになります。
オブジェクトの管理方法をManager側で変更できるようにしたいという事なのでしょうが、
それによって生じている制約(getのせいでPKが1列で数値とか)は気になるところではありますね。

それはいろいろ検討してみるといいと思います。

class Manager<T extends IGetPK> {
    protected ArrayList<T> objs = new ArrayList<T>();

    public T get(int pk) {
        for (T obj : objs) {
            if (obj.getPk() == pk) {
                return obj;
            }
        }
        return null;
    }
}

class EmployeeManager extends Manager<Employee> {

    public EmployeeManager(int[] pk, String[] name, int[] fk) {
        for (int i : pk) {
            objs.add(new Employee(i, name[i], fk[i]));
        }
    }
}

class UnitManager extends Manager<Unit> {

    public UnitManager(int[] pk, String[] name) {
        for (int i : pk) {
            objs.add(new Unit(i, name[i]));
        }
    }
}

interface IGetPK{
    public int getPk();
}


class Employee implements IGetPK {
    private int pk;
    private String name;
    private int fk;

    public Employee(int pk, String name, int fk) {
        this.pk = pk;
        this.name = name;
        this.fk = fk;
    }

    public int getFk() {
        return fk;
    }

    @Override
    public int getPk() {
        return pk;
    }

    public String getName() {
        return name;
    }
}

class Unit implements IGetPK {
    private int pk;
    private String name;

    public Unit(int pk, String name) {
        this.pk = pk;
        this.name = name;
    }

    @Override
    public int getPk() {
        return pk;
    }

    public String getName() {
        return name;
    }
}
以下のようにすれば動作するようになります。
オブジェクトの管理方法をManager側で変更できるようにしたいという事なのでしょうが、
それによって生じている制約(getのせいでPKが1列で数値とか)は気になるところではありますね。

それはいろいろ検討してみるといいと思います。


```java
class Manager<T extends IGetPK> {
    protected ArrayList<T> objs = new ArrayList<T>();

    public T get(int pk) {
        for (T obj : objs) {
            if (obj.getPk() == pk) {
                return obj;
            }
        }
        return null;
    }
}

class EmployeeManager extends Manager<Employee> {

    public EmployeeManager(int[] pk, String[] name, int[] fk) {
        for (int i : pk) {
            objs.add(new Employee(i, name[i], fk[i]));
        }
    }
}

class UnitManager extends Manager<Unit> {

    public UnitManager(int[] pk, String[] name) {
        for (int i : pk) {
            objs.add(new Unit(i, name[i]));
        }
    }
}

interface IGetPK{
    public int getPk();
}


class Employee implements IGetPK {
    private int pk;
    private String name;
    private int fk;

    public Employee(int pk, String name, int fk) {
        this.pk = pk;
        this.name = name;
        this.fk = fk;
    }

    public int getFk() {
        return fk;
    }

    @Override
    public int getPk() {
        return pk;
    }

    public String getName() {
        return name;
    }
}

class Unit implements IGetPK {
    private int pk;
    private String name;

    public Unit(int pk, String name) {
        this.pk = pk;
        this.name = name;
    }

    @Override
    public int getPk() {
        return pk;
    }

    public String getName() {
        return name;
    }
}
```