Интерфейс как тип возврата

Может ли интерфейс быть возвращаемым типом функции. Если да, то в чем преимущество. например это следующий код, правильный, когда возвращается массив интерфейса.

public interface Interface
{
    int Type { get; }
    string Name { get; }
}

public override Interface[] ShowValue(int a)
{
.
.

}

Ответы

Ответ 1

Да, вы можете вернуть интерфейс.

Предположим, что классы A и B реализуют интерфейс Ic:

public interface Ic
{
    int Type { get; }
    string Name { get; }
}

public class A : Ic
{
     .
     .
     .
}

public class B : Ic
     .
     .
     .
}

public Ic func(bool flag)
{
     if (flag)
         return new A();
       return new B();

}

В этом примере func похож на factory method — он может возвращать разные объекты!

Ответ 2

Да interface - очень действительное возвращаемое значение. Помните, что вы не возвращаете определение интерфейса, а скорее экземпляр этого интерфейса.

Пособие очень ясно, рассмотрите следующий код:

public interface ICar
{
    public string Make { get; }
}

public class Malibu : ICar
{
    public string Make { get { return "Chevrolet"; } }
}

public class Mustang : ICar
{
    public string Make { get { return "Ford"; } }
}

теперь вы можете вернуть несколько разных экземпляров ICar, которые имеют свои собственные значения.

Но основная причина использования интерфейсов заключается в том, что они могут быть разделены между сборками в хорошо известном контракте, так что, когда вы передаете кому-то a ICar, они ничего не знают об этом, но они знают это имеет a Make. Кроме того, они ничего не могут выполнить против него, кроме публичного интерфейса. Поэтому, если Mustang имел член public с именем Model, они не могли до него добраться, если это не было в интерфейсе.

Ответ 3

Да, это возможно.

Преимущество состоит в том, что вы можете абстрагировать типы возврата (и ввода).

public interface IFruit{ }

public class Apple: IFruit{}

public class Pear: IFruit{}

...

public function IFruit SelectRandomFromBasket(Basket<IFruit> basket){
  // this function can return Apple, Pear
}