Я согласен, что в большинстве случаев простота, а не сложность - это хорошая стратегия, если ваша простота не слишком близорука (см. Хермс, напишите код таким образом, чтобы его можно было легко переформулировать позже).
Тем не менее, я также знаю, как трудно скрыть эту ошибку в вашем ухе, которая поощряет более тщательный дизайн. Если вы все еще хотите отдать предпочтение наследованию без необходимости думать с точки зрения «базового класса» и «подкласса», вы можете просто определить интерфейс (например, IProcessWatcher), который реализуется ProcessWatcher. Когда вы используете объект ProcessWatcher, обращайтесь к нему в терминах интерфейса, чтобы, если позже вы решите создать BrowserWatcher (или любой другой тип ProcessWatcher), вы можете сделать это, не заставляя его спускаться с ProcessWatcher, пока реализует интерфейс IProcessWatcher.
Предупреждение: Действуйте с осторожностью. Становится заманчивым желание определить интерфейс для каждого отдельного объекта, и давайте посмотрим правде в глаза, это просто смешно. =)
В конечном счете, вам нужно найти то, что вам обоим удобно, поскольку вам обоим придется поддерживать этот код, и я думаю, что это может быть хорошим компромиссом, а не просто «Наследование или отсутствие наследования».
Удачи!