C>Ну да, можно и так. Принцип тот же самый.
Видимо ты имеешь в виду, что IEnumerator<Class3> GetEnumerator() и IEnumerator IEnumerable.GetEnumerator() можно было бы имплементировать одним методом.
Про covariant returns types пишут, что для интерфейсов эту фичу планировалось сделать позднее чем для классов
https://stackoverflow.com/questions/65230700/c-sharp-9-0-covariant-return-types-and-interfaces#comment115321098_65230700