Страницы

Поиск по вопросам

среда, 5 февраля 2020 г.

Не выходит правильно наследовать интерфейс C#

#c_sharp #интерфейс


Есть интерфейс IHost

public interface IHost 
         where TAddress : IAddress 
         where TPingResult : IPingResult
{
    TAddress HostAddress { get; set; }
    TPingResult Response { get; set; }
    void SendRequest();
}


Затем его наследует ITCPHost

public interface ITCPHost: IHost 
{

}


И я реализую интерфейс ITCPHost в классе TCPHost

public class TCPHost : ITCPHost
{
    public ITCPAddress HostAddress { get; set; }
    public ITCPPingResult Response { get; set; }
    public Uri Uri { get; set; }

    public TCPHost(IPingResult response, IAddress address)
    {
        Response = (ITCPPingResult) response;
        HostAddress = (ITCPAddress) address;
    }

    public void SendRequest()
    {
        Метод что-то делает, не важно что...
    }


Затем я использую этот класс:

private static readonly Pinger.Pinger Pinger = new Pinger.Pinger();
private static readonly TCPPingResult Result = new TCPPingResult();
private static readonly TCPAddress Address = new TCPAddress("8.8.8.8",80);
private static readonly TCPHost Host = new TCPHost(Result, Address);
public PingHost()
{
    Pinger.PingEvent += NewPingHandler;
    Pinger.Ping(Host, 1); /* === ОШИБКА === */
}


В предпоследней строке кода выдает ошибку


  Severity  Code    Description Project File    Line    Suppression State
  Error   CS1503  Argument 1: cannot convert from 'ProtocolPinger.Hosts.TCPHost'
to 'ProtocolPinger.Hosts.IHost'  ProtocolPinger  D:\Projects\Visual Studio\ProtocolPinger\ProtocolPinger\Program.cs
 27  Active


Почему он не принимает наследника интерфейса? В чем ошибка?

Сигнатура метода Ping:

public void Ping(IHost host, int period)

    


Ответы

Ответ 1



Все дело в том, что IHost и IHost - это разные интерфейсы. Для того, чтобы первый можно было скастовать ко второму - надо сделать его ковариантным: interface IHost. Но в таком случае типы-параметры можно будет использовать только в качестве выходных (на что и намекает ключевое слово out): public interface IHost where TAddress : IAddress where TPingResult : IPingResult { TAddress HostAddress { get; } TPingResult Response { get; } void SendRequest(); } Если же вам нужны именно входные параметры, то задача решения не имеет, потому что IAddress невозможно привести к ITCPAddress в общем случае.

Комментариев нет:

Отправить комментарий