Я знаю, что это старый вопрос, но я несколько раз сталкивался с этой проблемой при написании C #, и я хочу знать ... почему бы просто не использовать интерфейс?
Когда вы создаете свой подкласс класса стороннего фреймворка, также сделайте так, чтобы он реализовал открытый интерфейс. Затем определите этот интерфейс, включив в него только те методы, к которым клиент должен получить доступ. Затем, когда клиент запрашивает экземпляр этого класса, вместо этого предоставьте ему экземпляр этого интерфейса.
Кажется, это C # -приемлемый способ делать подобные вещи.
Первый раз, когда я сделал это, я понял, что стандартная библиотека C # не имеет варианта словаря только для чтения. Я хотел предоставить доступ к словарю, но не хотел давать клиенту возможность изменять элементы в словаре. Итак, я определил «класс DictionaryEx : Dictionary , IReadOnlyDictionary , где V: IV», где K - тип ключа, V - тип действительного значения, а IV - интерфейс к типу V, который предотвращает изменения. Реализация DictionaryEx была в основном простой; единственной трудной частью было создание класса ReadOnlyEnumerator, но даже это не заняло много времени.
Единственный недостаток, который я вижу в этом подходе, заключается в том, что клиент пытается динамически привести ваш открытый интерфейс к связанному подклассу. Чтобы остановить это, сделайте свой класс внутренним. Если ваш клиент преобразует ваш общедоступный интерфейс в исходный базовый класс, я думаю, для них было бы совершенно ясно, что они берут свою жизнь в свои руки. : -)