Java Класс Собрать все дочерние атрибуты - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу создать класс, который может иметь дочерние атрибуты. Например:

public class Parent {
    private String a;
    private String b;
}
public class ChildA extends Parent {
    private String c;
    private String d;
}
public class ChildB extends Parent {
    private String e;
    private String f;
}

Как Parent может иметь атрибуты ChildA при пропуске ChildA и ChildB при пропуске ChildB? Это можно сделать, просто набрав Object, но как это сделать более OOP способом?

1 Ответ

0 голосов
/ 28 апреля 2020

Вот как я бы это сделал ... при условии, что я правильно понимаю, что вы спрашиваете:

public class Parent {
    private String a;
    private String b;

    public List<String> collect() {
        return Arrays.asList(a, b);
    }
}

public class ChildA extends Parent {
    private String c;
    private String d;

    @Override
    public List<String> collect() {
        List<String> res = new ArrayList<>();
        res.addAll(super.collect());
        res.add(c);
        res.add(d);
        return res;
    }
}

У родительского класса есть прямая реализация для collect().

Дочерний класс переопределяет реализацию collect() от своего родителя, а в методе он вызывает родительские классы collect().

. Этот подход дает довольно повторяющийся код.


Альтернативным подходом было бы использование отражения, чтобы найти все поля, взломать доступ private, а также извлечь и добавить все их значения в объект List. Код для этого нетривиален, но его нужно реализовать только один раз.

Подход с помощью отражения нарушает абстракцию типов для доступа к закрытым полям в другом классе. Это немного против OO ... в зависимости от вашей точки зрения.

...