ISomeInterface referenceVariable = ClassThatImplementsIt

本文关键字:ClassThatImplementsIt referenceVariable ISomeInterface | 更新日期: 2023-09-27 18:12:25

目前我正在学习ASP。asp.net MVC 5。我被困在了《依赖注入》这本书里的某一点上。我会尽我最大的努力学习如何使用它,但在我这样做之前,我希望你能帮助我。我几周前开始学习c#,但有一件事我还没有弄清楚,那就是接口。我知道为什么和什么时候创建它,但我真的不明白什么时候创建引用变量。

假设我有一个叫做IValueCalculator的接口。然后我有一个类LINQValueCalculator它实现了IValueCalculator。现在,我的误解来了。

LINQValueCalculator referenceVariable = new LINQValueCalculator();

这将创建一个新的实例,并将绑定到referencvariable。然后,我可以使用接口告诉我使用的所有内容以及添加到类中的任何内容。

但是,如果我这样做呢?

IValueCalculator referenceVariable = new LINQValueCalculator();

有什么区别?我还能像以前一样做同样的事情吗?还是有些事情发生了变化?

如果我有这样的东西呢

public class ShoppingCart
{
    private IValueCalculator calc;
    public ShoppingCart(IValueCalculator calcParam)
    {
        calc = calcParam;
    }

这意味着我只能放置那些实现该接口的对象的引用,对吗?还是我错了?

当我真正理解了这一切的意义后,我将继续学习Ninject (DI)

ISomeInterface referenceVariable = ClassThatImplementsIt

底层对象仍然是LINQValueCalculator,但是您只能在使用referenceVariable时引用IValueCalculator的方法和属性,因为该变量只是接口。

要使用LINQValueCalculator的任何属性,您必须强制转换变量。每次需要时都可以这样做:

((LINQValueCalculator)referenceVariable).SomeMethod();

或者只有一次:

var anotherReference = (LINQValueCalculator)referenceVariable;

这里,anotherReferencereferenceVariable是对同一个对象的引用,所以对其中一个对象的更改将反映在另一个对象上。

使用接口意味着您可以将对象传递给其他不知道(或不需要知道)LINQValueCalculator,但作用于IValueCalculator的属性和方法的代码。

有什么区别?我还能像以前一样做同样的事情吗?还是有些事情发生了变化?

你可以做同样的事情:-)除非具体类型提供了比接口更多的方法!

这意味着我只能放置那些实现该接口的对象的引用,对吗?还是我错了?

你是对的!

在最后一种情况下使用interface的好处是你可以接收一个实现IValueCalculator的对象,但你(真的)不关心具体类型。

如果您决定创建第二个实现IValueCalculator的具体类型(可能更性能?),您可以这样做并将其注入ShoppingCart构造函数,而无需更改ShoppingCart代码!

相关文章:
  • 没有找到相关文章