gpt4 book ai didi

c# - 何时使用接口(interface)类型的变量而不是具体类型

转载 作者:太空宇宙 更新时间:2023-11-03 21:52:58 25 4
gpt4 key购买 nike

我有一个派生自接口(interface)的类。现在该类必须实现接口(interface)中的所有方法 + 它另外定义了 2 个方法。现在我的问题是,这样做的好处/用例是什么:

IMyInterface varInt= new ConcreteImp();

结束了,

ConcreteImp varInt= new ConcreteImp(); 

我看到代码块中的每个地方都使用了这种模式,但不确定为什么要使用它。

最佳答案

使用接口(interface)的好处是减少了部件对软件组件具体实现的依赖。在您发布的一行中,您将看不到任何好处。该界面的使用者可以获得好处。

Edit: You would be well to read this article on abstractions.

例如,假设您有一个方法接受这样的接口(interface) Rent(IMovie) .另一个人将能够编写 Rent() 的实现不知道 IMovie 细节的方法调用该方法时将传入的类型。然后您将能够创建多个不同的 IMovie可能有不同的计费方法的实现,但是Rent()方法不必处理这个问题。

void Rent(IMovie movie)
{
var price = movie.Price();
movie.MarkReserved();
}

public interface IMovie { }

public class Oldie : IMovie
{
private decimal _oldieRate = 0.8;

public decimal Price()
{
return MainData.RentPrice * _oldieRate;
}
public decimal MarkReserved()
{
_oldiesDb.MarkReserved(this, true);
}
}


public class Blockbuster : IMovie
{
private decimal _blockbusterRate = 1.2;

public decimal Price()
{
return MainData.RentPrice * _blockbusterRate ;
}
public decimal MarkReserved()
{
_regularDb.MarkReserved(this, true);
}
}

这是接口(interface)为何有用的示例,但不是很好的代码设计示例。

根据经验,您应该编写方法,以便它们需要最少的输入来工作,并且它们的输出提供尽可能多的信息供其他人在调用它时使用。例如,看看下面的签名:

public List<Entity> Filter(IEnumerable<Entity> baseCollection){ ... }

此方法仅请求 IEnumerable<Entity>所以它可以采用不同的集合类型,比如 List<Entity> , Entity[]或自定义类型一些工具返回。但是你返回List<Entity>这样您就不会立即将调用者限制为可枚举元素。例如,她可以立即对返回值使用 Linq。

还有更多好处,例如在单元测试中,您可以在其中创建模拟对象并告诉它们在与其余代码交互期间的行为方式。不过,您现在可以使用带有虚方法的类来做到这一点。

关于c# - 何时使用接口(interface)类型的变量而不是具体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13621766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com