Я откажусь от размышлений о вашем размышлении и просто посмотрю на идеи зависимости.
Отделите то, что разумно, чтобы отделить. Сцепление подразумевает, что если одно меняется, то должно меняться и другое Таким образом, ваш NewCode использует ClassType, если некоторые его аспекты изменяются, тогда вы, безусловно, должны изменить NewCode - его нельзя полностью отделить. Что из следующего вы хотите отделить от?
- Семантика, что делает ClassType.
- Интерфейс, как вы это называете.
- Реализация, как это реализовано.
На мой взгляд, первые два - разумная связь. Но, безусловно, изменение реализации не должно требовать изменения NewCode. Так что используйте интерфейс. Мы стараемся сохранять интерфейсы фиксированными, мы склонны расширять их, а не менять их, сохраняя их обратно-совместимыми, если это вообще возможно. Иногда мы используем пары имя / значение, чтобы попытаться сделать интерфейс расширяемым, а затем обнаруживаем тип ошибок, на которые вы ссылаетесь. Это компромисс между гибкостью и «безопасностью типов».