Пространство имен не проблема - просто два класса не связаны, поэтому нет цепочки наследования, которую вы можете использовать для полиморфизма.
Вам нужно будет посмотреть на что-то вроде утка, набрав , или шаблон адаптера , или создать собственные прокси-классы, чтобы получить общий интерфейс. Для небольшого числа реализаций мне просто удалось создать один класс адаптера, который делегирует любому непустому экземпляру:
interface IFeet {
void WashFeet();
}
class FeetAdapter : IFeet {
private PigFeet.Feet _pigFeet;
private HorseFeet.Feet _horseFeet;
private FeetAdapter(PigFeet.Feet pigFeet) {
_pigFeet = pigFeet;
}
private FeetAdapter(HorseFeet.Feet horseFeet) {
_horseFeet = horseFeet;
}
public void WashFeet() {
if (_pigFeet != null) {
_pigFeet.WashFeet();
} else {
_horseFeet.WashFeet();
}
}
public static FeetAdapter Create(AnimalType animalType) {
switch (animalType) {
case AnimalType.Pig:
return new FeetAdapter(new PigFeet.Feet());
case AnimalType.Horse:
return new FeetAdapter(new HorseFeet.Feet());
}
}
}
В более крупных случаях лучше использовать отдельные PigFeetAdapter и HorseFeetAdapter, которые оба реализуют IFeet, а также FeetAdapterFactory для их создания - но концепция такая же, как я показываю выше.