using System.Collections.Generic;
public static void Main()
using var x = MyFactory.CreateImagination();
Console.WriteLine("Done");
public static class MyFactory{
public static IImagination CreateImagination(){
return new MyClass("error");
public interface IImagination : IDisposable{
public class MyClass : MyBase{
private readonly IList<int> _largeNumbers;
public MyClass(string init) : base(init){
Console.WriteLine("inside my-class");
_largeNumbers = [10, 23, 45, 99, 102];
Console.WriteLine("my-class initialized");
public override string SayHello(){
protected override void Dispose(bool disposing){
Console.WriteLine($"inside DISPOSE my-class {_disposed}-{disposing}");
for(var i = _largeNumbers.Count -1; i > 0; i--){
_largeNumbers.RemoveAt(i);
public abstract class MyBase : IImagination, IDisposable {
protected IList<int> _smallNumbers;
public MyBase(string init){
Console.WriteLine("inside my-base");
_smallNumbers = [1, 5, 6, 7, 9];
if(init=="error") return;
Console.WriteLine("my-base initialized");
public abstract string SayHello();
GC.SuppressFinalize(this);
protected virtual void Dispose(bool disposing){
Console.WriteLine($"inside DISPOSE my-base {_disposed}-{disposing}");
for(var i = _smallNumbers.Count -1; i > 0; i--){
_smallNumbers.RemoveAt(i);