У меня есть бизнес-кейс, в котором 3 вещи, которые должны произойти, в следующей последовательности:Принудительно метод порядок выполнения в абстрактном классе
- скачать()
- процесса()
- загрузки()
Теперь абстрактное класс FileTransfer обеспечивает реализацию для 1. downloadFiles() и 3. upload(), но не 2. process() - дочерние классы (например, Mu sicFileTransfer или VideoFileTransfer или PDFFileTransfer) будут делать разные вещи на этапе 2. process().
Так что кажется очевидным, чтобы сделать абстрактный класс следующим образом:
public abstract class FileTransfer {
public void download() {
// implementation provided
}
public abstract void process(); // implementation not provided
public void upload() {
// implementation provided
}
}
Но один вопрос - Там будет никогданикогда быть время, в котором это нормально, скажем, MusicFileTransfer для вызова процесса() перед загрузкой() или любого другого порядка. Процесс всегда должен быть 1. download(), 2. process(), затем 3. upload().
Так я представляю себе что-то вроде:
public void doTransfer() {
// private methods since we want to enforce this order of execution
download(); // implem provided
process(); // abstract method
upload(); // implem provided
}
в FileTransfer, чтобы обернуть вокруг этих трех вызовов. Но для того, чтобы дочерний класс MusicFileTransfer переопределил process() ... он должен быть общедоступным или защищенным (не закрытым).
Что мне делать, чтобы обойти этот рассол? Имейте общедоступный doTransfer() и публичный процесс() и просто убедитесь, что процесс() никогда не называется? Или покончить с doTransfer() и надеяться, что порядок всегда правильный?
все еще было бы возможно подкласс вызвать 'процесса()' само по себе, правильно? таким образом, не проходит метод 'final doTransfer()'? Может быть, я придирчивый/упрямый, но я чувствую, что это проблема ... – mmcrae
Да, вы не можете запретить кому-либо писать подкласс, который вызывает 'process'; но ответственность за подкласс лежит на поддержании любого контракта, создаваемого суперклассом. – rgettman