// Modul

// ReSharper disable InconsistentNaming
module CheatSheet.GO {
 // Schnittstelle
 export interface IKontakt {
  id: number;
  name: string;
  geprueft: boolean;
  erfassungsdatum: Date;
  toString(details: boolean): string;
 }
}


module CheatSheet.GO {

 function sealed(target) {
  console.log("Decorator!");
 }

 /** Kontakt mit id, name, ort,
 * @autor Dr. Holger Schwichtenberg
 */
 //@sealed
 export class Kontakt implements GO.IKontakt {

  // ---------- Properties ohne Getter/Setter
  public geprueft: boolean;
  private _erfassungsdatum: Date;

  get erfassungsdatum(): Date {
   return this._erfassungsdatum;
  }

  // ---------- Properties mit Getter/Setter
  set erfassungsdatum(erfassungsdatum: Date) {
   this._erfassungsdatum = erfassungsdatum;
  }

  /**
  * @param id Kundenummer
  * @param name Kundenname
  */
  constructor(
   public id: number,
   public name: string) {
   this.erfassungsdatum = new Date();
   this.id = id; // Diese Zeile ist ueberfluessig !!!
   Kontakt.Anzahl++;
  }

  // Öffentliche Methode
  toString(details: boolean = false): string {
   {
    var e: string = `${this.id}: ${this.name}`;
    return e;
   }
  }

  // Statisches Mitglied
  static Anzahl: number;
 }
 // #endregion


 enum KundenArt {
  A = 1, B, C
 }



 // #region Erbende Klasse
 export class Kunde extends Kontakt {
  public KundenArt: number;
  constructor(id: number, name: string, umsatz: number)
  {
   super(id, name);
   this.KundenArt = KundenArt.C;
   if (umsatz > 10000) this.KundenArt = KundenArt.A;
   if (umsatz > 5000) this.KundenArt = KundenArt.B;
  }
  toString() { return `Kunde ${super.toString()}`; }
 }

 // #endregion




 export class Verbindung<T1 extends Kontakt, T2 extends Kontakt> {
  constructor(public k1: T1, public k2: T2) {
  }
  public toString(): string {
   return `${this.k1.name} is verbunden mit ${this.k2.name}`;
  }
 }
} // End Module

