Когда использовать абстрактные классы: руководство по эффективному проектированию программного обеспечения