【问题标题】:interface as return type接口作为返回类型
【发布时间】:2013-03-13 17:23:18
【问题描述】:

接口可以是函数的返回类型。如果是,那有什么好处。例如以下代码在返回接口数组的位置是否正确。

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

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

}

【问题讨论】:

标签: c# interface


【解决方案1】:

是的,你可以返回一个接口。

假设类AB 都实现了接口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 就像工厂方法——它可以返回不同的对象!

【讨论】:

  • 能否将接口的返回解释为“返回已实现Ic的对象”?这让我很困惑,因为我们无法创建接口实例,但我们可以返回一个。
  • 这是因为接口是一个“类型”描述,就像一个 int 或类,但是一个接口可以有它的类型的多个实现。因此,当您返回“接口”时,您实际上是在返回所述接口的实现。如果您执行“IExample example = new ExampleImpl();”然后是“example .GetType() == typeof(ExampleImpl)”,这将返回 true。但对于所述接口的其他实现是错误的。 @Yu Zhang 这对你有意义吗?
【解决方案2】:

是的,interface 是一个非常有效的返回值。请记住,您返回的不是接口的定义,而是该接口的instance

好处很明显,考虑下面的代码:

public interface ICar
{
    string Make { get; }
}

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

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

现在您可以返回许多不同的 ICar 实例,它们具有各自的值。

但是,使用接口的主要原因是它们可以在众所周知的合同中在程序集之间共享,这样当您向某人传递ICar 时,他们对此一无所知,但他们知道有一个Make。此外,除了公共接口之外,他们无法对其执行任何操作。因此,如果Mustang 有一个名为Modelpublic 成员,除非它在界面中,否则他们无法访问。

【讨论】:

  • 这让我很困惑,因为我们不能创建接口的实例,但我们可以返回接口的实例。您的意思是返回已实现接口的对象的实例吗?
【解决方案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】:

    是的,这是可能的,这对公共职能来说是件好事。

    对于您问题的为什么部分,我不会复制粘贴其他人的答案,所以请参考现有答案,例如:

    【讨论】:

    • 如果您找到了关于同一主题的其他问题/答案,最好close as duplicate而不是链接到其他帖子?
    • @ChaseFlorell 当然。实际上我正在写我自己的答案,然后意识到这可能已经得到了回答,所以我清除了自己的文本并添加了一些有用的链接......但无论如何都投票关闭为重复。
    【解决方案5】:

    是的,我将从 golang 的角度回答您的问题,我们可以使用接口作为返回类型,这意味着您可以返回任何数据类型,例如 int、float、string 等。

    接口 = 任何数据类型

    package main
    
    import (
        "fmt"
    )
    
    func any (u interface{}) interface{} {
        fmt.Printf("Type: %T\n",u)
        return u
    }
    
    func main(){
        fmt.Println("value: ",any(5))
        fmt.Println(any("testing"))
    }
    

    Output

    【讨论】:

    • 你好,这个问题被标记为 C#,而不是 Go。
    • 谢谢! #Paul,老实说,我没有观察到标签。但这个问题与golang有关,将帮助golang和goswagger的用户......同时了解返回类型和处理程序。
    • 同意@Artaghal。虽然问题被标记为 c#,但它回答了第一个问题(Can interface be a return type of a function)。这可能不适用于其他语言(如果函数可以返回接口),但对于 Golang 和 C# 都是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2011-06-27
    相关资源
    最近更新 更多