static void Main(string[] args) { // Create an Animal object and call the constructor Animal spot = new Animal(15, 10, "Spot", "Woof"); // Get object values with the dot operator Console.WriteLine("{0} says {1}", spot.name, spot.sound); // Calling a static method Console.WriteLine("Number of Animals " + Animal.getNumOfAnimals()); // Calling an object method Console.WriteLine(spot.toString()); Console.WriteLine("3 + 4 = " + spot.getSum(3, 4)); // You can assign attributes by name Console.WriteLine("3.4 + 4.5 = " + spot.getSum(num2: 3.4, num1: 4.5)); // You can create objects with an object initializer Animal grover = new Animal { name = "Grover", height = 16, weight = 18, sound = "Grrr" }; Console.WriteLine(grover.toString()); // Create a subclass Dog object Dog spike = new Dog(); Console.WriteLine(spike.toString()); spike = new Dog(20, 15, "Spike", "Grrr Woof", "Chicken"); Console.WriteLine(spike.toString()); // One way to implement polymorphism is through an abstract class Shape rect = new Rectangle(5, 5); Shape tri = new Triangle(5, 5); Console.WriteLine("Rect Area " + rect.area()); Console.WriteLine("Trit Area " + tri.area()); // Using the overloaded + on 2 Rectangles Rectangle combRect = new Rectangle(5, 5) + new Rectangle(5, 5); Console.WriteLine("combRect Area = " + combRect.area()); // ---------- GENERICS ---------- // With Generics you don't have to specify the data type of an element in a class or method KeyValue <string, string> superman = new KeyValue <string, string>("", ""); superman.key = "Superman"; superman.value = "Clark Kent"; superman.showData(); // Now use completely different types KeyValue <int, string> samsungTV = new KeyValue <int, string>(0, ""); samsungTV.key = 123456; samsungTV.value = "a 50in Samsung TV"; samsungTV.showData(); Console.Write("Hit Enter to Exit"); string exitApp = Console.ReadLine(); }