求助:接口是引用类型的不太理解

to189 2017-01-07 09:53:06
interface IIfc1
{
void PrintOut(string s);
}

class MyClass : IIfc1
{
public void PrintOut(string s)
{
Console.WriteLine("calling through:{0}",s);
}
}

class Program
{
static void Main(string[] args)
{
MyClass mc = new MyClass();
mc.PrintOut("object");

IIfc1 ifc = (IIfc1)mc;
ifc.PrintOut("interface");

Console.ReadKey();
}

}

小弟学到接口一章,见书中所说 接口是引用类型,上述代码有一段不理解,请大侠帮忙解答
IIfc1 ifc = (IIfc1)mc;
ifc.PrintOut("interface");
把类的对象强制转换为接口?然后调用接口中的方法?这样用的场景是什么?
...全文
267 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
传说之心 2017-01-08
  • 打赏
  • 举报
回复
IIfc1 ifc = (IIfc1)mc; 这是多此一举,MyClass 实现了IIfc1接口,本来就可以自动转换成IIfc1类型。 然后回答你的问题。 在面向对象编程中,这个叫多态,根据“历史替换原则”,任何new父类的地方都可以用子类替带,接口也一样。 多态就是为了说,有相似结构的类型调用的时候可以不用知道是哪一种具体的类只要让他们集成共同的父类或接口,然后重写相同的方法,这样在外部看来,调用的都是父类,而外部需要的也只是父类中声明的方法实际运行时的引用肯定是具体的子类,但是子类又重写了父类的方法,那这样不同的子类重写父类方法,其业务功能也会不同,这就是多态
threenewbee 2017-01-08
  • 打赏
  • 举报
回复
IIfc1 ifc = mc; 就可以了,因为class MyClass : IIfc1,它天然就实现了这个接口,也没有隐式实现接口
  • 打赏
  • 举报
回复
将具体类型的变量(的引用的对象)赋值给兼容抽象类型的变量,是不需要写“强制类型转换”语法的。当然如果写了,想自己强调一下注释一下,也可以。 6年前我回复过一个关于强制类型转换语法的问题,你可以看看 http://bbs.csdn.net/topics/360039451。关键就在于,不论是 mc 还是 ifc,都引用同一个对象,这是关键概念。不是说什么“接口是MyClass对象实例中的一部分”这种说法。 把“抽象-具体化”给误解为“整体-部分”关系那就大错特错了。就好像说“白马也是马”,并不是说一匹白马的身体里另外住着一匹马,一匹白马“就是”一匹马。因此这里的这个 mc (的引用的对象)就是 ifc (的引用的对象)。 解决了这个问题,那么你就不会“只见树木不见森林”,你始终是从整体上看,只是同一个对象的类型声明不同、让编译器更容易检查编程语法错误而已。 所以其实代码
            MyClass mc = new MyClass();
            mc.PrintOut("object");

            IIfc1 ifc = (IIfc1)mc;
            ifc.PrintOut("interface");
是一个误导,它强调的是标题党(也就是纠结c#代码来写代码,而不是根据对象实例来写代码)。真实的写法是
            MyClass mc = new MyClass();
            mc.PrintOut("object");
            mc.PrintOut("interface");
或者
            llfc1 mc = new MyClass();
            mc.PrintOut("object");
            mc.PrintOut("interface");
的含义也是一样的,按照你心目中的对象实例来编程,那么你知道不论标题党是 MyClass 还是 llfc1,你都说的是同一个对象。
to189 2017-01-08
  • 打赏
  • 举报
回复
多谢解答!!!

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧