Antes:
public virtual void Cleanup()
{
throw new NotImplementedException("Override Cleanup()");
}
public virtual int Total { get { throw new NotImplementedException("Override Total"); } }
Depois de:
public abstract void Cleanup();
public abstract int Total { get; }
Imagine que este código seja produzido por um cara sênior: D