问个接口和类的问题

Tony_Xian 2017-08-31 04:35:15
using System;
using System.Threading;

namespace test
{
interface IIfc1
{
void PrintOut(string s);
}
class MyClass : IIfc1
{
public void PrintOut(string s)
{
Console.WriteLine("Calling through: {0}", s);
}
}
class Program
{
static void DoSomething(IIfc1 a)
{
a.PrintOut("a");
}
static void Main()
{
MyClass mc = new MyClass();
IIfc1 ab = mc;
DoSomething(mc);
Console.ReadKey();
}
}


DoSomething(mc); //这两句代码
Console.ReadKey(); //不理解
如何理解能将类的对象赋值给接口的对象,反之就不行,然后方法调用类的对象传入参数列表是接口的函数中?
...全文
179 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
有时候我们把赋值符号右边的应用叫做对象 --> 有时候我们把赋值符号右边的引用叫做对象 没有什么“对象给对象赋值”的说法。都是给变量赋值,怎么可能给对象赋值呢?而清楚地运用变量概念,就知道这是用来引用任何对象的符号,只是一个符号而已。
  • 打赏
  • 举报
回复
根本没有什么“将类的对象赋值给接口的对象”。对象怎么“赋值给”对象?明明是将对象(对象的变量引用值)赋值给变量。有时候我们把赋值符号右边的应用叫做对象,例如叫做“对象 mc”,这是一种简略的说法,混淆对象和引用它的变量。但是绝不会把赋值号左边的变量说成是一个对象。赋值号左边就是一个变量而已。 那么一个变量声明为IIfc1 类型的,它就可以用来引用任何兼容于 IIfc1的对象,也就是说把 mc 的值让 ab 也能引用,在编译器看来是没有错误的。就好像一个声明为“设备”的变量来引用一个兼容于“照明设备”的变量所引用的对象,或者这个对象实际上实例化时是一个“节能电灯”,这是完全没有问题的。 这是面向对象编程的基本特征。这叫做多态。一个变量 ab 可以引用任何兼容于 IIfc1 的对象,从而可以通过变量 ab 来可靠地操作这个对象的所有在 IIfc1 类型(包括接口)上定义的特性。
正怒月神 2017-08-31
  • 打赏
  • 举报
回复
如何理解能将类的对象赋值给接口的对象,反之就不行,然后方法调用类的对象传入参数列表是接口的函数中? 这需要从理解 继承和多态的概念出发。 派生类的功能只会大于等于父类。 所以派生类可以转换为父类,因为从意义上来讲,将派生类转换为父类,反而是削弱了其功能。 这里父类可以是抽象类,可以是接口,都没问题。 父类是粗糙的,子类是精细的。 把精细的东西变粗糙很方便,把粗糙的东西变精细就不容易了。 在说说为何反过来不行。首先接口不能new,所以也就没有接口实例赋值给派生类的说法了。 然后讨论父类,派生类为何不能直接转换为父类? 因为一个父类可以存在多个派生类。 编译器并不知道,你的父类能否安全的转换为当前的派生类。所以需要一个显示转换。
ilikeff8 2017-08-31
  • 打赏
  • 举报
回复
mc是MyClass类的一个实例 MyClass继承了接口IIfc1 I接口IIfc1可以看做是一种抽象的约定 DoSomething(mc); 参数是传mc这个MyClass类的实例 static void DoSomething(IIfc1 a) { a.PrintOut("a"); } 等于 static void DoSomething(MyClass mc) { IIfc1 l=(IIfc1)mc; l.PrintOut("a"); } 调用约定好的这个PrintOut方法

111,092

社区成员

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

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

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