c# 中可以用接口直接定义一个变量吗?为什么?

程序代码如下,这两句怎么理解
? IWrapper<string> bb = aa; //为什么可以用接口定义一个变量?
aa.SetData("Hello"); //为什么bb不能换成aa?

class Program
{
static void Main(string[] args)
{
Wrapper<string> aa = new Wrapper<string>();
IWrapper<string> bb = aa; //为什么可以用接口定义一个变量?
aa.SetData("Hello"); //为什么bb不能换成aa?
Console.WriteLine("存储的值是{0}",bb.GetData());

}
interface IWrapper<T>
{
void SetData(T data);
T GetData();
}
class Wrapper<T> : IWrapper<T>
{
private T storedData;
void IWrapper<T>.SetData(T data)
{
this.storedData = data;
}
T IWrapper<T>.GetData()
{
return this.storedData;
}

}

}
aa.SetData("Hello"); //为什么aa编译出错,换成bb就不会?

这是C#的一个特性,叫显式实现接口,通过这个方式,对象只能被当作接口引用的时候才能调用相关的方法。

这个东西出现的目的是因为java里面没有相关的概念,假如java里面一个对象要实现两个接口,一个是ICalculator,一个是ICombiner,两个接口同时包含Add方法,就没办法以不同的意义分别实现。而C#里面如果你使用两个接口实现两个不同的Add方法,那么在对象当作ICalculator的时候执行的是ICalculator.Add的方法,而当作ICombiner的时候执行的是ICombiner.Add方法。但是当对象是实现类的时候是访问不到这两个方法的,只能强制转换((ICalculator)obj).Add这样调用
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-04
接口只能定义,但不能直接实例化本身,需要实例化为一个实现了该接口的类。比如:
interface IWrapper{ void function(int a ); //只定义,不提供实现 }
class classA:IWrapper{ void function (int a ) {//do something } }
使用:IWrapper wrapper=new classA(); //实例化为实现它的一个类
wrapper.function(a); //只能调用接口里定义的方法,执行的是classA中的方法的实现
第2个回答  2012-11-04
void IWrapper<T>.SetData(T data)
{
this.storedData = data;
}
改成
public void SetData(T data)
{
this.storedData=data;
}
这样编译应该就不会出错了本回答被网友采纳
第3个回答  2012-11-04
不可以

c# 中可以用接口直接定义一个变量吗?为什么?
这是C#的一个特性,叫显式实现接口,通过这个方式,对象只能被当作接口引用的时候才能调用相关的方法。这个东西出现的目的是因为java里面没有相关的概念,假如java里面一个对象要实现两个接口,一个是ICalculator,一个是ICombiner,两个接口同时包含Add方法,就没办法以不同的意义分别实现。而C#里面如果你...

c#中怎样用接口定义变量?
这个涉及到接口和实现接口的类的概念.你可以用接口定义一个变量,但这个变量必须实例化成一个具体的,实现了这个接口的类,比如你上面的例子里, P_Document.Range一定是一个实现了Word.Range或者是包含了Word.Range的接口.如class P_Document.Range:Word.Range 一定有类似代码吧,这样定义的好处是,这个P_R...

C# 中,接口到底有用没用阿?
简单举例,接口实现数据层与界面交互,比如我要插入很多数据到数据库,要看到进度条,怎么办?数据层如何跟界面交互,可能我还想实现一个线程,跨线程怎么刷新主线程控件,这时候就用到接口技术。我们定义一个接口 然后在数据层使用接口传输百分比:窗体里集成接口,写接口方法,执行数据层方法 界面上就是显...

c#字符串里的数字可以定义成变量吗 如"{0:f3}"中的3
我们可以看到其中的格式说明"{0:f3}"是一个字符串,那么我们就可以用字符串的“加法”编写咯。Console.WriteLine()函数中{}格式项是这样规定的:格式项都采用如下形式:{index[,alignment][:formatString]} 其中"index"指索引占位符,这个肯定都知道;",alignment"按字面意思显然是对齐方式,以","为...

C#中的接口(interface)有什么作用,什么时候要用到它?
我和你一样, 刚开始学C#的时候, 感觉接口没什么用, 纯粹是鸡肋, 可是现在进了软件公司实习才知道, 接口是很重要的!尤其是设计模式, 基本上都要使用接口, 因为接口将面向对象的特点体现得淋漓尽致. 所以, 把接口理解透彻, 对你的编程生涯是很有帮助的.如果还有疑问, 请与我交流: marki1986@126....

c#接口与抽象类的疑问
接口一般用于更高层次的抽象和概括。他这个例子也能理解,人、鱼、青蛙,共性较少,只能用一些零散的方法来描述共性,那么就用接口;后者共性较多,把后者的共有方法、属性归纳起来,可以大致组成一个 AbstractFish 类了,那么就用抽象类。而会游泳,作为接口,可以适用多个不同的类。

为什么要定义接口(为什么定义接口后不能再加方法)
在系统分析和架构中,分清层次和依赖关系,每个层次不是直接向其上层提供服务(即不是直接实例化在上层中),而是通过定义一组接口,仅向上层暴露其接口功能,上层对于下层仅仅是接口依赖,而不依赖具体类。 系统灵活性增强 当下层需要改变时,只要接口及接口功能不变,则上层不用做任何修改。甚至可以在不改动上层代码时将下...

C#中,abstract的类与interface的区别?
接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)...

C#中的接口是什么?具体的含义,接口有什么作用
· 一个接口定义一个只有抽象成员的引用类型。C#中一个接口实际所做的,仅仅只存在着方法标志,但根本就没有执行代码。这就暗示了不能实例化一个接口,只能实例化一个派生自该接口的对象。· 接口可以定义方法、属性和索引。所以,对比一个类,接口的特殊性是:当定义一个类时,可以派生自多重接口,...

C#中接口问题请教老师问题如下 1.接口可在某个类中定义吗?VS中还是得...
1接口为行为,不发在类内部定义,但是可以作为其成员属性 2可以用实现类自己累new实例化 3自己的方法,当然可以自己实例化后,调用了

相似回答