Я не знаю .Net, так что это общий совет объектно-ориентированного программирования. Тем не менее, вы выглядите так, будто задаете общий вопрос о дизайне ОО.
Похоже, вы пытаетесь сделать двойная отправка ; то есть выберите фактический код, который будет выполнен на основе типа времени выполнения двух разных вещей.
Традиционный способ очистки с помощью OO для двойной отправки - шаблон посетителя . Не дайте себя одурачить ни именем, ни примерами, описывающими шаблон для обхода какой-то сдерживающей структуры; это также очень полезно, даже если у вас есть только один объект за раз!
По сути, вы должны определить некоторый интерфейс - CommonButtonHandler - и затем реализовать его как для электронных таблиц, так и для документов. Когда нажимается общая кнопка «тиддл», вы делаете:
// Inside CommonTwiddleButton.onClick()
currentCommonButtonHandler.twiddleButtonClicked()
В Интернете есть несколько хороших примеров использования шаблона посетителя для двойной отправки; просто убедитесь, что ищите оба термина, иначе вы получите либо несколько примеров шаблонов посетителей, которые предполагают, что вам нужно пройти какую-то гетерогенную коллекцию, либо кучу лишних слов, хвастающихся тем, что их объектная система просто выполняет множественную диспетчеризацию. по умолчанию.