namespace ConsoleApp1.Animals { internal class MealReceiverAdapter : IMealReceiver { public IMealContainer MealContainer { get; } public MealReceiverAdapter(IMealContainer mealContainer) { MealContainer = mealContainer; } public void PutAMeal(int iCount) { for(int i = 0; i < iCount; i++) { MealContainer.PutAMeal(1); } } } internal class MealContainer : IMealContainer { private int MealCount = 10; public int GetAMeal() { if (MealCount == 0) return 0; MealCount--; return 1; } public void PutAMeal(int iCount) { MealCount += iCount; } } internal class MealConsumer : IDisposable { public IMealContainer Container { get; } public int MealCount { get; private set; } = 0; public MealConsumer(IMealContainer container) { Container = container; } public void ThreeHoursLater() { MealCount += Container.GetAMeal(); } public void Dispose() { for(int ii =0; ii < MealCount; ii++) { Container.PutAMeal(1); } } } internal class Animal { #region internal classes internal class MilkConsumerAreaInfo { public int Volume { get; set; } public DateTime MonitoringDate { get; set; } } private class MilkConsumer { public int MilkVolume { get; set; } } #endregion private List knownMilkConsumers = new List(); private string _typeName; public void MeetMilkConsumer(int Volume) { knownMilkConsumers.Add(new MilkConsumer() { MilkVolume = Volume }); } public void MeetMilkProduce(int Volume) { knownMilkConsumers.Add(new MilkConsumer() { MilkVolume = -Volume }); } internal MilkConsumerAreaInfo GetAreaInfo() { return new MilkConsumerAreaInfo(); } protected void SetAnimalTypeName(string sTypeName) { _typeName = sTypeName; } } internal class CatAnimal : Animal { public CatAnimal() { SetAnimalTypeName("cat"); } } }