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

程序代码如下,这两句怎么理解?IWrapper<string>bb=aa;//为什么可以用接口定义一个变量?aa.SetData("Hello");//为什么bb不能换成... 程序代码如下,这两句怎么理解
? 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就不会?
展开
 我来答
草薙在
2012-11-04 · TA获得超过4795个赞
知道大有可为答主
回答量:6187
采纳率:50%
帮助的人:6285万
展开全部
这是C#的一个特性,叫显式实现接口,通过这个方式,对象只能被当作接口引用的时候才能调用相关的方法。

这个东西出现的目的是因为java里面没有相关的概念,假如java里面一个对象要实现两个接口,一个是ICalculator,一个是ICombiner,两个接口同时包含Add方法,就没办法以不同的意义分别实现。而C#里面如果你使用两个接口实现两个不同的Add方法,那么在对象当作ICalculator的时候执行的是ICalculator.Add的方法,而当作ICombiner的时候执行的是ICombiner.Add方法。但是当对象是实现类的时候是访问不到这两个方法的,只能强制转换((ICalculator)obj).Add这样调用
凯_哥__
2012-11-04
知道答主
回答量:72
采纳率:0%
帮助的人:66.5万
展开全部
接口只能定义,但不能直接实例化本身,需要实例化为一个实现了该接口的类。比如:
interface IWrapper{ void function(int a ); //只定义,不提供实现 }
class classA:IWrapper{ void function (int a ) {//do something } }
使用:IWrapper wrapper=new classA(); //实例化为实现它的一个类
wrapper.function(a); //只能调用接口里定义的方法,执行的是classA中的方法的实现
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
最后的仙人
2012-11-04 · TA获得超过1961个赞
知道大有可为答主
回答量:1509
采纳率:0%
帮助的人:1390万
展开全部
void IWrapper<T>.SetData(T data)
{
this.storedData = data;
}
改成
public void SetData(T data)
{
this.storedData=data;
}
这样编译应该就不会出错了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
shangyousky
2012-11-04
知道答主
回答量:2
采纳率:0%
帮助的人:3086
展开全部
不可以
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式