
module GenericDemo {

 export enum Geschlecht {
  maennlich, weiblich
 }

 export class Person {
  name: string;
  geschlecht: Geschlecht;

  constructor(name: string) {
   this.name = name;
  }
 }

 export class Mann extends Person {

  constructor(name: string) {
   super(name);
   this.geschlecht = Geschlecht.maennlich;
  }
 }


 export class Frau extends Person {

  constructor(name: string) {
   super(name);
   this.geschlecht = Geschlecht.weiblich;
  }
 }

 export class Ehepaar<T1 extends Person, T2 extends Person> {
  constructor(public Person1: T1, public Person2: T2) {
  }
  print() {
   var typename1 = this.Person1 instanceof Mann ? "Mann" : "Frau";
   var typename2 = this.Person2 instanceof Mann ? "Mann" : "Frau";
   ausgabe(typename1 + " (" + Geschlecht[this.Person1.geschlecht] + "): " + this.Person1.name);
   ausgabe(typename2 + " (" + Geschlecht[this.Person2.geschlecht] + "): " + this.Person2.name);
  }
 }

 class Beruf {

  constructor(public name: string) {
  }
 }


 export function run() {
  var William = new Mann("William");
  var Kate = new Frau("Kate");
  var Paar1 = new Ehepaar<Mann, Frau>(William, Kate);
  Paar1.print();
  ausgabe(typeof Paar1);

  // Das geht nicht:
  var William = new Mann("William");
  var beruf = new Beruf("Prinz");
  //var Paar2 = new Ehepaar<Mann, Beruf>(William, beruf);
 }



}
