Java - шаблон проектирования проверки подкласса - PullRequest
1 голос
/ 10 февраля 2012

У меня базовый класс C с полями X, Y и Z.

C1 расширяет C и имеет дополнительное поле, T.

В конструкторе C1 я вызываю супер (C) конструктор с некоторымижестко закодированные значения для полей X, Y и Z.Затем я установил T.

Существуют ли какие-либо шаблоны для автоматической проверки всех полей C1 путем выполнения каких-либо действий в конструкторе C?Поэтому я пытаюсь передать автоматическую проверку в базовый класс.

Обратите внимание, что вызов супер-конструктора должен выполняться перед любым оператором в конструкторе C1.Я начал с какого-то абстрактного validate() метода, но я не на правильном пути.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 10 февраля 2012

В принципе, C не должен знать о свойствах C1, поскольку C1 является специализацией C. Однако вы можете создать абстрактный метод validate () в C, который должен быть реализован в C1.Затем в конструкторе C вы можете вызвать абстрактный метод.Поскольку C1 должен будет реализовать validate (), он может добавить туда проверку своего свойства / поля.

1 голос
/ 10 февраля 2012

Хотя это противоречит всем принципам ОО, вы можете воспользоваться свойством отражения Java.С помощью отражения вы можете узнать, какие методы и поля есть в классе.Таким образом, вы можете передать объект подкласса в базовый класс, а базовый класс может проверить все поля и проверить их.Если вы сделаете это в конце конструктора подкласса, вы можете позволить методу проверки вернуть значение, чтобы увидеть, являются ли эти значения действительными или нет.

Я хочу заявить, что я не думаю, что это правильнопуть, но он должен работать

0 голосов
/ 10 февраля 2012

Я бы сказал, что суперкласс должен сам себя проверять. Объект должен обеспечить выполнение своего собственного контракта. Любая проверка значений C должна выполняться в его собственном конструкторе. Аналогично, подкласс должен проверять себя.

public class A {
    private int x;

    public A(int x) {
        if (x < 0) throw new IllegalArgumentException("x cannot be negative");
        this.x = x;
    }
}

public class B extends A {
    private String y;

    public B(int x, String y) {
        super(x);
        if (y == null) throw new IllegalArgumentException("y cannot be null");
        this.y = y;
    }
}
0 голосов
/ 10 февраля 2012
class C{
    Object x, y, z;
    public C(Object x, Object y, Object z){
        this.x = x;
        this.y = y;
        this.z = z;
    }
    public boolean validate(){ /**do stuff**/}
}

class D{
    public D(/**args**/){
        super(/**args**/);
        if(validate()){
            /**do stuff**//
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...