Мне нужно создать фабрику, которая создает сборщики сообщений и отправителей сообщений. У меня есть три интерфейс:Использование интерфейса с контравариантным типом в качестве возвращаемого типа метода в интерфейсе с ковариантным типом
public interface IMessageFactory<out T> where T : GenericMessage
{
IMessageBuilder<T> CreateBuilder();
IMessageSender<T> CreateSender();
}
public interface IMessageBuilder<out T>
{
T Build(EmailMessage message);
T Build(EmailTask task);
}
public interface IMessageSender<in T>
{
void Send(T message);
}
Проблема заключается в том, что IMessageFactory не будет компилироваться, как компилятор говорит, что
Invalid variance: The type parameter 'T' must be contravariantly valid on 'IMessageFactory<T>.CreateSender()'. 'T' is covariant.
Если я T ковариант в IMessageSender, я не могу использовать его в качестве типа аргумент метода.
И мне нужно T, чтобы быть ковариантны в IMessageFactory для того, чтобы сделать что-то вроде:
public IMessageFactory<GenericMessage> CreateMessageFactory(DispatchService dispatchService)
{
if (dispatchService == DispatchService.Service1)
{
return new Service1MessageFactory();
}
else if (dispatchService == DispatchService.Service2)
{
return new Service2MessageFactory();
}
return null;
}
где
public class Service1MessageFactory : IMessageFactory<Message<Service1Message>>
{
}
public class Service2MessageFactory : IMessageFactory<Message<Service2Message>>
{
}
public class Message<T> : GenericMessage
{
public T SpecificMessage { get; private set; }
public string UserLogin { get; set; }
public Message(T message, string userLogin)
{
SpecificMessage = message;
}
}
Я зашел в тупик. Есть идеи?
UPD.
Возможно, я делаю все неправильно, поэтому я просто опишу, что мне в основном нужно, и, может быть, вы можете дать мне несколько советов о том, как я могу это достичь.
Итак, мне нужно:
- , чтобы иметь возможность создавать строитель и отправитель сообщений различных типов
- иметь заводы, которые будут создавать строитель и отправитель для каждого типа сообщений
- иметь завод метод, который будет создавать фабрику в соответствии с переданным ей параметром
Зачем вам нужно 'IMessageFactory' быть контравариантным в' T'? –
@BenReich Я обновил свой вопрос, чтобы дать понять. – HiveHicks
Как насчет наличия интерфейсов для 'MessageBuilderFactory' и 'MessageSenderFactory ' и с инвариантом 'MessageHandlerFactory ', который наследует оба? –
supercat