Могу ли я объявить метод интерфейса для возврата универсального интерфейса в C #? - PullRequest
0 голосов
/ 28 августа 2018

Я пытаюсь создать универсальный интерфейс, где один из его методов будет возвращать T, который также может быть интерфейсом, возможно ли это в C #?

public interface IGetCard<T>
{
  T WithBoard<T>(string boardName);
}

А затем, чтобы реализовать это:

public class GetCard : IGetCard
{
  public IGetCard WithBoard<IGetCard>(string boardName)
  {
    // ...do stuff...
    return this;
  }
}

Мое намерение состоит в том, чтобы реализовать этот интерфейсный метод из различных классов, которые реализуют этот интерфейс, например ::10000

public class DisplayCard : IDisplayCard, IGetCard
{
  public IDisplayCard WithBoard<IDisplayCard>(string boardName)
  {
    // ...do stuff...
    return this;
  }
}

Какая лучшая альтернатива для достижения этой цели?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Просто укажите общий аргумент в определении класса:

public interface IGetCard<T>
{
    // be aware that I omitted the <T> from the signature, as T is 
    // already defined on the class-level
    T WithBoard(string boardName); 
}
public class GetCard : IGetCard<MyCard>
{
    public GetCard WithBoard(string boardName)
    {
        // ...do stuff...
        return this;
    }
}

Конечно, поскольку IGetCard<MyCard> и IGetCard<YourCard> - это совершенно разные интерфейсы, которые не имеют ничего общего, вы также можете реализовать оба из своего класса:

public class DisplayCard : ICard<MyCard>, IGetCard<YourCard>
{
    public MyCard WithBoard(string boardName)
    {
        // ...do stuff...
        return ...;
    }
    public YourCard WithBoard(string boardName)
    {
        // ...do stuff...
        return ...;
    }
}
0 голосов
/ 28 августа 2018

Да, вы можете сделать это, как это:

public interface IGetCard<out TCard>
{
    TCard WithBoard(string boardName);
}

public class DisplayCard : IDisplayCard, IGetCard<IDisplayCard>
{
    public IDisplayCard WithBoard(string boardName)
    {
       // ...do stuff...
       return this;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...