static void Main(string[] args) { // Generics [7], Inheritance [2] // Create objects var mother = new Society <Human>(new Human("Mary", 30, Sex.Female)); var father = new Society <Human>(new Human("Alex", 35, Sex.Male)); var daughter = new Child("Ann", 15, Sex.Female); var boyfriend = new Child("Jack", 20, Sex.Male); // Objects relations [0] mother.Relationships[Relations.Daughter.ToString()] = daughter.Id; father.Relationships[Relations.Daughter.ToString()] = daughter.Id; daughter.Relationships[Relations.Mother.ToString()] = mother.Id; daughter.Relationships[Relations.Father.ToString()] = father.Id; // Father is responsible for daugter money needs daughter.NeedMoney += new Human.Money(father.GiveMoneyFor); // Event [6] // When Daughter asks father for money - he gives her decimal need = 100.00M; var givedMoney = daughter.InvokeNeedMoney(father, Relations.Daughter, need); // Event [6] // But father give her money rely on old rule if (givedMoney != decimal.Zero) { Console.WriteLine("father gives daughter {0}", givedMoney); } Society <Human> .GroupWalking(new List <Human>(){ mother, father, daughter }); // Polymorphism [3] // Child growth and become at full in touch with society var adultDaughter = Society <Human> .InTouch(daughter, 15); // Work with classes var adultBoyfriend = Society <Human> .InTouch(boyfriend, 15); // New adult relations adultDaughter.Relationships[Relations.Boyfriend.ToString()] = adultBoyfriend.Id; // Attribute[5] adultBoyfriend.Relationships[Relations.Girlfriend.ToString()] = adultDaughter.Id; var theyMarry = Society <Human> .GetMarried(adultDaughter, adultBoyfriend); // Attribute[5] Console.WriteLine("They " + (theyMarry ? "have" : "have not") + " been married"); adultDaughter.Relationships[Relations.Husband.ToString()] = adultBoyfriend.Id; // Attribute[5] adultBoyfriend.Relationships[Relations.Wife.ToString()] = adultDaughter.Id; // Requirement //Daughter can`t worh : daughter.Work mother.Work(); father.Work(); adultDaughter.Work(); Console.ReadLine(); }