Да, название не имеет особого смысла, но вот моя ситуация.
У меня есть два интерфейса, скажем, IGen и ITrans. Некоторые из моих классов реализуют IGen, некоторые реализуют ITrans, а некоторые - оба
У ITrans есть один метод (Translate), а у IGen - один метод (Generate). Для классов, которые реализуют как ITrans, так и IGen Generate, просто вызывают Translate.
У меня также есть интерфейс IGenAndTrans, который просто определяется как
public interface IGenAndTrans : IGen , ITrans
{
}
И у меня есть класс (назовите его Holder), у которого IGenAndTrans является свойством.
[Serializable] //<- Problem
public class Holder
{
public IGenAndTrans GeneratorAndTranslator { get; set;}
}
Теперь я хочу пометить класс Holder с помощью [SerializableAttribute] и использовать XmlSerializer.
Однако я не могу этого сделать, потому что у Holder есть свойство интерфейса. Обычно рекомендуемый подход состоит в том, чтобы сделать IGenAndTrans абстрактным базовым классом и использовать XmlInclude. Я делал это успешно в прошлом.
Однако я не уверен, как это сделать в этом случае. Поскольку многие мои классы реализуют как IGen, так и ITrans, они не могут просто наследовать от абстрактного базового класса. Это означало бы, что мне нужно было бы разделить каждый из этих классов на два класса с соответствующим дублированием кода (так как генерация вызовов переводит большую часть времени)
Какие-нибудь рекомендации (если мне удалось объяснить себя достаточно хорошо)? Может быть, я слишком близок к коду и должен реализовывать его по-другому.