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就不会? 展开
? 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就不会? 展开
4个回答
展开全部
这是C#的一个特性,叫显式实现接口,通过这个方式,对象只能被当作接口引用的时候才能调用相关的方法。
这个东西出现的目的是因为java里面没有相关的概念,假如java里面一个对象要实现两个接口,一个是ICalculator,一个是ICombiner,两个接口同时包含Add方法,就没办法以不同的意义分别实现。而C#里面如果你使用两个接口实现两个不同的Add方法,那么在对象当作ICalculator的时候执行的是ICalculator.Add的方法,而当作ICombiner的时候执行的是ICombiner.Add方法。但是当对象是实现类的时候是访问不到这两个方法的,只能强制转换((ICalculator)obj).Add这样调用
这个东西出现的目的是因为java里面没有相关的概念,假如java里面一个对象要实现两个接口,一个是ICalculator,一个是ICombiner,两个接口同时包含Add方法,就没办法以不同的意义分别实现。而C#里面如果你使用两个接口实现两个不同的Add方法,那么在对象当作ICalculator的时候执行的是ICalculator.Add的方法,而当作ICombiner的时候执行的是ICombiner.Add方法。但是当对象是实现类的时候是访问不到这两个方法的,只能强制转换((ICalculator)obj).Add这样调用
展开全部
接口只能定义,但不能直接实例化本身,需要实例化为一个实现了该接口的类。比如:
interface IWrapper{ void function(int a ); //只定义,不提供实现 }
class classA:IWrapper{ void function (int a ) {//do something } }
使用:IWrapper wrapper=new classA(); //实例化为实现它的一个类
wrapper.function(a); //只能调用接口里定义的方法,执行的是classA中的方法的实现
interface IWrapper{ void function(int a ); //只定义,不提供实现 }
class classA:IWrapper{ void function (int a ) {//do something } }
使用:IWrapper wrapper=new classA(); //实例化为实现它的一个类
wrapper.function(a); //只能调用接口里定义的方法,执行的是classA中的方法的实现
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void IWrapper<T>.SetData(T data)
{
this.storedData = data;
}
改成
public void SetData(T data)
{
this.storedData=data;
}
这样编译应该就不会出错了
{
this.storedData = data;
}
改成
public void SetData(T data)
{
this.storedData=data;
}
这样编译应该就不会出错了
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询