Обеспечение метода называется - PullRequest
3 голосов
/ 01 апреля 2009

У меня есть этот класс:

public abstract class AbstractIncomingCall {

    /*
    class properties
    */

    public void changeStatus(/*some parameters*/){
        //store parameters in class properties
        isValid();
    }

    protected abstract boolean isValid();
}

... который расширен этим классом:

public class IncomingCallImpl extends AbstractIncomingCall{

    //I override the parent's method
    public void changeStatus(/*same parameters as parent's method*/) {
        super.changeStatus(/*same parameters as parent's method*/);
        //do something interesting 
    }

    protected boolean isValid() throws StatusChangeNotOccurredException {
        //implement my validation algorithm
    }

Чего я хотел бы добиться, так это убедиться, что всякий раз, когда changeStatus (/ * некоторые параметры * /) вызывается, вызывается метод isValid (); обратите внимание, что метод isValid () реализован только в конкретном классе, а также использует свойства класса, унаследованные от родительского класса. Есть ли способ, которым я могу следовать, чтобы гарантировать, что isValid () вызывается иначе, чем вызов super? Мне очень не нравится тот факт, что я должен передавать параметры повсюду, я думаю, что я иду совершенно в неправильном направлении, и есть более чистый способ добиться этого. То, что я хотел бы сохранить в своем коде, это «логика вызова isValid ()» в абстрактном классе, потому что каждый вызов должен быть проверен, и я не могу рассчитывать на то, что я запомню это в будущем: P

Заранее спасибо:]

Ответы [ 4 ]

14 голосов
/ 01 апреля 2009

Похоже, вы хотите, чтобы changeStatus () следовал шаблону Template Method. В этом шаблоне вы определяете changeStatus () в абстрактном классе (делая его окончательным, если вы не доверяете людям расширяться должным образом), и вызываете необходимые методы:

public final void changeStatus()
{
    doSomethingSubclassSpecific();
    isValid()
}


protected abstract doSomethingSubclassSpecific();
2 голосов
/ 01 апреля 2009

Вы можете сделать changeStatus финальным и добавить к нему вызов метода customChangeStatus, который можно переопределить. как показано ниже:

открытый абстрактный класс AbstractIncomingCall {

/*
class properties
*/

public final void changeStatus(/*some parameters*/){
    //store parameters in class properties
    isValid();
    customChangeStatus();
}

protected abstract void customChangeStatus();
protected abstract boolean isValid();

}

Вы можете даже реализовать пустой метод для customChangeStatus, поэтому вам не нужно всегда его реализовывать. Используя final в changeStatus, вы уверены, что это будет логика при вызове ваших классов. И у вас все еще есть гибкость, чтобы добавить пользовательское поведение к нему.

2 голосов
/ 01 апреля 2009

Вам не нужно переопределять changeStatus(). Вы очень близки к реализации шаблона метода шаблона проектирования.

0 голосов
/ 01 апреля 2009

Я предлагаю использовать композицию, а не наследование. В таком случае все должно стать более очевидным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...