日期:2014-05-18  浏览次数:20909 次

看《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();

        }
    }
}