ArrayList of Custom Objects
namespace Ch11Ex01 { class Program { static void Main(string[] args) { WriteLine("Create an ArrayList type collection of Animal " + "objects and use it:"); ArrayList animalArrayList = new ArrayList(); Cow myCow2 = new Cow("Rual"); animalArrayList.Add(myCow2); animalArrayList.Add(new Chicken("Andrea")); foreach (Animal myAnimal in animalArrayList) { WriteLine($"New {myAnimal.ToString()} object added to ArrayList collection," + $" Name = {myAnimal.Name}"); } // New Ch11Ex01.Cow object added to ArrayList collection, Name = Rual WriteLine($"ArrayList collection contains {animalArrayList.Count} " + " objects."); ((Animal)animalArrayList[0]).Feed(); ((Chicken)animalArrayList[1]).LayEgg(); ReadKey(); } } }
The last two lines shown above are interesting and require some explanation. First, review polymorphism.
The ArrayList collection is a collection of System.Object objects (you have assigned Animal objects via polymorphism). This means that you must use casting for all items.
namespace Ch11Ex01 // file: Animal.cs { public abstract class Animal { protected string name; public string Name { get { return name; } set { name = value; } } public Animal() { name = "The animal with no name"; } public Animal(string newName) { name = newName; } public void Feed() => WriteLine($"{name} has been fed."); } }
namespace Ch11Ex01 // file: Cow.cs { public class Cow : Animal { public void Milk() => WriteLine($"{name} has been milked."); public Cow(string newName) : base(newName) { } } }
namespace Ch11Ex01 // Chicken.cs { public class Chicken : Animal { public void LayEgg() => WriteLine($"{name} has laid an egg."); public Chicken(string newName) : base(newName) { } } }