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)
底层对象仍然是LINQValueCalculator
,但是您只能在使用referenceVariable
时引用IValueCalculator
的方法和属性,因为该变量只是接口。
要使用LINQValueCalculator
的任何属性,您必须强制转换变量。每次需要时都可以这样做:
((LINQValueCalculator)referenceVariable).SomeMethod();
或者只有一次:
var anotherReference = (LINQValueCalculator)referenceVariable;
这里,anotherReference
和referenceVariable
是对同一个对象的引用,所以对其中一个对象的更改将反映在另一个对象上。
使用接口意味着您可以将对象传递给其他不知道(或不需要知道)LINQValueCalculator
,但作用于IValueCalculator
的属性和方法的代码。
有什么区别?我还能像以前一样做同样的事情吗?还是有些事情发生了变化?
你可以做同样的事情:-)除非具体类型提供了比接口更多的方法!
这意味着我只能放置那些实现该接口的对象的引用,对吗?还是我错了?
你是对的!
在最后一种情况下使用interface的好处是你可以接收一个实现IValueCalculator
的对象,但你(真的)不关心具体类型。
如果您决定创建第二个实现IValueCalculator
的具体类型(可能更性能?),您可以这样做并将其注入ShoppingCart
构造函数,而无需更改ShoppingCart
代码!