function Complex(real, imaginary) {
    BaseObject.call(this);
    this.real = real || 0;
    this.imaginary = imaginary || 0;
}

Complex.prototype = Object.create(BaseObject.prototype);
Complex.prototype.constructor = Complex;

Complex.prototype.setReal = function (real) {
    this.real = real;
    this.registerAction('setReal', [real]);
};

Complex.prototype.setImaginary = function (imaginary) {
    this.imaginary = imaginary;
    this.registerAction('setImaginary', [imaginary]);
};

Complex.prototype.getReal = function () {
    this.registerAction('getReal', []);
    return this.real;
};

Complex.prototype.getImaginary = function () {
    this.registerAction('getImaginary', []);
    return this.imaginary;
};

Complex.prototype.add = function (other) {
    this.real += other.real;
    this.imaginary += other.imaginary;
    this.registerAction('add', [other]);
};

Complex.prototype.subtract = function (other) {
    this.real -= other.real;
    this.imaginary -= other.imaginary;
    this.registerAction('subtract', [other]);
};

Complex.prototype.multiply = function (other) {
    const real = this.real * other.real - this.imaginary * other.imaginary;
    const imaginary = this.real * other.imaginary + this.imaginary * other.real;
    this.real = real;
    this.imaginary = imaginary;
    this.registerAction('multiply', [other]);
};

Complex.prototype.divide = function (other) {
    const denominator =
        other.real * other.real + other.imaginary * other.imaginary;
    const real =
        (this.real * other.real + this.imaginary * other.imaginary) /
        denominator;
    const imaginary =
        (this.imaginary * other.real - this.real * other.imaginary) /
        denominator;
    this.real = real;
    this.imaginary = imaginary;
    this.registerAction('divide', [other]);
};

Complex.prototype.toString = function () {
    this.registerAction('toString', []);
    return `${this.real} + ${this.imaginary}i`;
};
