Я бы сказал, что стандартный подход здесь заключается в том, чтобы обернуть класс, который вы хотите «наследовать», в переменную защищенного экземпляра, а затем эмулировать все не приватные члены (метод / свойства / события / и т.д.) обернутого класса. в вашем классе контейнера. Затем вы можете пометить этот класс и его соответствующих членов как виртуальные, чтобы использовать с ним стандартные функции полиморфизма.
Вот пример того, что я имею в виду. ClosedClass
- это класс, содержащийся в сборке, код которого у вас нет доступа.
public virtual class WrapperClass : IClosedClassInterface1, IClosedClassInterface2
{
protected ClosedClass object;
public ClosedClass()
{
object = new ClosedClass();
}
public void Method1()
{
object.Method1();
}
public void Method2()
{
object.Method2();
}
}
Если бы любая сборка, на которую вы ссылаетесь, была спроектирована хорошо, то все типы / элементы, к которым вы, возможно, когда-либо захотите получить доступ, будут помечены соответствующим образом (абстрактные, виртуальные, запечатанные), но на самом деле это, к сожалению, не так (иногда вы можете даже испытал эту проблему с библиотекой базовых классов). На мой взгляд, класс-обертка - это то, что нужно. У него есть свои преимущества (даже когда класс, из которого вы хотите получить , наследуем ), а именно удаление / изменение модификатора методов, к которым у пользователя вашего класса нет доступа. ReadOnlyCollection<T>
в BCL является довольно хорошим примером этого.