Обычно объект имеет «жизненный цикл» с 3 основными методами (категориями), один для конструктора или инициализации объекта, один для основной операции объекта и один для деструктора или завершения объекта.
Если у класса / объекта есть больше методов, обычно это соответствие одной из трех упомянутых мной категорий.
Если вы хотите создать OOAPI, одно из ограничений, вы можете применитьявляется то, что эти 3 категории методов / методов являются общедоступными для ваших пользователей API.
В вашем примере вы используете состояния или переходы.Я не думаю, что вам нужно подкласс, потому что это очень простой класс.Обычно, когда используется класс конечного автомата, вам может потребоваться функция public , которая возвращает текущее состояние объекта.
(пример стиля C ++ может изменить ваш progr. lang.)
class MyStatusMachineClass {
protected:
int _CurrentStatus = 0;
public:
int currentStatus(); // <-- main operation category method
void startEncoding(); // <-- not a constructor, but works like one
void appendFrame(); // <-- main operation category method
void finishEncoding(); // <-- not a destructor, but works like one
} // end class
Ваши методы, которые ограничены состоянием, должны вызвать эту функцию перед выполнением своей операции.Вы также можете добавить, что делать в случае возникновения ошибки.
Особенно, если пользователь API хочет вызвать startEncoding (), а объект находится не в том состоянии, в котором он должен быть.
Существует несколько способов обработки ошибок, например, исключений, но в случае API я рекомендую, чтобы при обнаружении ошибки программа не прерывалась, но во внутренней переменной поля был сохранен код ошибки, открытыйфункция возвращает это значение
(пример стиля C ++, возможно, измените ваш прогр. lang.)
class MyStatusMachineClass {
protected:
int _CurrentStatus = 0;
int _LastErrorCode = 0; // <-- "0" means "no error"
public:
int currentStatus(); // <-- main operation category method
int LastErrorCode();
void startEncoding(); // <-- not a constructor, but works like one
void appendFrame(); // <-- main operation category method
void finishEncoding(); // <-- not a destructor, but works like one
} // end class
void main()
{
MyStatusMachineClass* myStatusMachineObject = new MyStatusMachineClass();
myStatusMachineObject->appendFrame();
if (myStatusMachineObject->LastErrorCode()) {
cout << "Error: Cannot append frame in current status.";
}
delete myStatusMachineObject();
}
Cheers.