簡體   English   中英

在協變類型的接口中使用具有協變類型的接口作為方法的返回類型

[英]Using interface with contravariant type as a return type of a method in an interface with covariant type

我需要創建一個生產消息生成器和消息發送者的工廠。 我有三個接口:

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.

如果在IMessageSender中使T為協變量,則不能將其用作方法參數的類型。

我需要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。

可能我做錯了所有事情,所以我只描述我基本需要的東西,也許您可​​以給我一些有關如何實現它的提示。

因此,我需要:

  1. 能夠為不同類型的消息創建構建器和發送者
  2. 有工廠將為每種消息類型創建構建器和發送者
  3. 具有將根據傳遞給它的參數創建工廠的工廠方法

有任何想法嗎?

使IMessageFactory<T>不變。 問題解決了。

您現在擁有的系統類型不安全,這就是為什么它不合法的原因。 您知道為什么它不安全嗎? 假設您具有IMessageFactory<Tiger>的實現,該實現具有方法CreateSender ,該方法返回IMessageSender<Tiger> 然后,您可以調用Send(new Tiger()) ,一切都很好。

如果然后可以將原始IMessageFactory<Tiger>轉換為IMessageFactory<Animal> (因為它是協變的),則可以從中獲取IMessageSender<Animal> ,然后可以調用Send(new Octopus())但是基本的實現方式記住老虎

編譯器知道會發生這種情況,因此一開始就阻止您編譯程序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM