Интерфейс как тип возврата
Может ли интерфейс быть возвращаемым типом функции. Если да, то в чем преимущество. например это следующий код, правильный, когда возвращается массив интерфейса.
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
}
Ответ 4
Да, это возможно, и это хорошо для публичных функций.
Для почему часть вашего вопроса, я не буду копировать ответы других людей, поэтому, пожалуйста, обратитесь к существующим ответам, например: