Мой первый вопрос: закрыты ли 2 класса сторонних компонентов? Они не были. По крайней мере, у нас это есть.
Итак, поскольку они не запечатаны, проблема решается следующим образом:
Извлечение общего интерфейса из совпадающих членов 2-х сторонних классов. Я назвал это Icommon.
public interface ICommon
{
string Name
{
get;
}
void DoThirdPartyStuff ();
}
Затем создайте 2 новых класса; DerivedClass1 и DerivedClass2, которые наследуются от ThirdPartyClass1 и ThirdPartyClass2 соответственно. Эти два новых класса реализуют интерфейс ICommon, но в остальном они полностью пусты.
public class DerivedClass1
: ThirdPartyClass1, ICommon
{
}
public class DerivedClass2
: ThirdPartyClass2, ICommon
{
}
Теперь, даже если производные классы пусты, интерфейс удовлетворяется базовыми классами, из которых мы извлекли интерфейс в первую очередь.
Результирующая диаграмма классов выглядит следующим образом.
альтернативный текст http://www.freeimagehosting.net/uploads/988cadf318.png
Так что теперь вместо того, что у нас было ранее:
ThirdPartyClass1 c1 = new ThirdPartyClass1 ();
c1. DoThirdPartyStuff ();
Теперь мы можем сделать:
ICommon common = new DerivedClass1 ();
common. DoThirdPartyStuff ();
И то же самое можно сделать с DerivedClass2.
В результате весь наш существующий код, который ссылается на экземпляр ThirdPartyClass1, можно оставить как есть, просто заменив ссылку ThirdPartyClass1 на ссылку ICommon. Ссылке ICommon можно было бы затем дать экземпляр DerivedClass1 или DerivedClass2, который, конечно, в свою очередь наследуется от ThirdPartyClass1 и ThirdPartyClass2 соответственно. И все просто работает.
Я не знаю, есть ли конкретное имя для этого, но для меня это выглядит как вариант шаблона адаптера.
Возможно, мы могли бы решить проблему с динамическими типами в C # 4.0, но это не имело бы преимущества проверки во время компиляции.
Мне было бы очень интересно узнать, есть ли у кого-нибудь другой элегантный способ решения этой проблемы.