﻿//----------------------
// <auto-generated>
// </auto-generated>
//----------------------







export class BaseClass implements IBaseClass {
    base!: string | undefined;

    protected _discriminator: string;

    constructor(data?: IBaseClass) {
        if (data) {
            for (var property in data) {
                if (data.hasOwnProperty(property))
                    (this as any)[property] = (data as any)[property];
            }
        }
        this._discriminator = "BaseClass";
    }

    init(_data?: any) {
        if (_data) {
            this.base = _data["Base"];
        }
    }

    static fromJS(data: any): BaseClass {
        data = typeof data === 'object' ? data : {};
        if (data["discriminator"] === "AbstractClass") {
            throw new Error("The abstract class 'AbstractClass' cannot be instantiated.");
        }
        if (data["discriminator"] === "SuperClass") {
            let result = new SuperClass();
            result.init(data);
            return result;
        }
        let result = new BaseClass();
        result.init(data);
        return result;
    }

    toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["discriminator"] = this._discriminator;
        data["Base"] = this.base;
        return data;
    }
}

export interface IBaseClass {
    base: string | undefined;
}

export abstract class AbstractClass extends BaseClass implements IAbstractClass {
    foo!: string | undefined;

    constructor(data?: IAbstractClass) {
        super(data);
        this._discriminator = "AbstractClass";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.foo = _data["Foo"];
        }
    }

    static override fromJS(data: any): AbstractClass {
        data = typeof data === 'object' ? data : {};
        if (data["discriminator"] === "SuperClass") {
            let result = new SuperClass();
            result.init(data);
            return result;
        }
        throw new Error("The abstract class 'AbstractClass' cannot be instantiated.");
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Foo"] = this.foo;
        super.toJSON(data);
        return data;
    }
}

export interface IAbstractClass extends IBaseClass {
    foo: string | undefined;
}

export class SuperClass extends AbstractClass implements ISuperClass {
    super!: string | undefined;

    constructor(data?: ISuperClass) {
        super(data);
        this._discriminator = "SuperClass";
    }

    override init(_data?: any) {
        super.init(_data);
        if (_data) {
            this.super = _data["Super"];
        }
    }

    static override fromJS(data: any): SuperClass {
        data = typeof data === 'object' ? data : {};
        let result = new SuperClass();
        result.init(data);
        return result;
    }

    override toJSON(data?: any) {
        data = typeof data === 'object' ? data : {};
        data["Super"] = this.super;
        super.toJSON(data);
        return data;
    }
}

export interface ISuperClass extends IAbstractClass {
    super: string | undefined;
}