看《Visual C#——从入门到精通》的问题
- C# code
interface IToken{...}class DefaultTokenImp1{...}class IdentifierToken : DefaultTokenImp1 , IToken{...}
然后书上说了:“通过学习,我们知道可以将一个变量定义成层次结构中较高位置的一个类,然后用这个变量来引用一个对象。类似地,可以将一个变量定义成类所实现的接口,然后用这个变量来引用一个对象。还是前面的例子,你可以使用一个IToken变量来引用一个IdentifierToken对象,如下所示:”
- C# code
IdentifierToken it = new IdentifierToken();IToken iTok = it; //合法
书上又说了:“利用这种技术,你可以在定义方法的时,让它接受不同类型的参数,只要类型实现了一个指定的接口。例如,下面展示的Process方法可以获取实现了IToken接口的任何参数:”
- C# code
void Process(IToken iTok){...}
注意,只能调用认这种方式引用一个对象时通过接口可见的方法。
先解释下红色的部分,然后在解释下黄色的部分,最后再解释下剩余的部分吧,谢谢
[解决办法]
通过学习,我们知道可以将一个变量定义成层次结构中较高位置的一个类,然后用这个变量来引用一个对象
==
基类的引用可以指向派生类的对象
人 a = new 男人();
类似地,可以将一个变量定义成类所实现的接口,然后用这个变量来引用一个对象
==
接口的引用可以指向实现接口的任何类的对象的实例,此时接口的功能即此对象实现的功能
开关 a = new 灯();
a.开();
开关 b = new 马桶();
b.开();
同样是开关这个接口,由于指向的对象不同,实现的功能就不一样
[解决办法]
- C# code
using System;using System.Collections.Generic;using System.Text;namespace ConsoleApplication1{ interface ITok //接口 { int Get();//提供方法 } class DefaultTokenImp1 { public int c; public int d; } class IdentifierToken : DefaultTokenImp1, ITok { public int Get()//实现接口方法 { int j; j = 10; return j; } } class Program { static void Main(string[] args) { IdentifierToken it = new IdentifierToken(); // IdentifierToken its = new DefaultTokenImp1();出错,子类无法转换为基类型。 DefaultTokenImp1 itt = it;//基类引用子列,没出错,只当it是对象,且通过对子类实例的变量赋值而达到使itt基类实例中变量的值发生改变。 it.c = 10; it.d = 20; ITok itok = it;//合法,接口只提供方法,不提供实现,itok接口搜寻并调用it中的方法,来实现itok.GET()这个方法; Console.WriteLine(itok.Get());//输出 Console.WriteLine(itt.c);//父类变量 Console.WriteLine(itt.d); Console.ReadLine(); } }}