随笔-6  评论-5  文章-23  trackbacks-0
申明:本文转载自Bear-Study-Hard

一、接口的基本概念

接口的定义方式与类比较相似。

    interface IMyInterface
    {
        //interface members
    }

接口成员的定义与类成员的定义之间的区别:

1.不允许使用访问修饰符(public,private,protected或internal),所有的接口成员都是公共的。

2.接口成员不能包含代码体。

3.接口不能定义域成员(属性)。

4.接口成员不能使用关键字static,virtual,abstract或sealed来定义。

5.类型定义成员是禁止的。

如果需要隐藏继承了基接口的成员,可以使用new关键字来定义它们,例如:

    interface IMyInterface
    {
        void DoSomething();
    } 

    interface IMyDerivedInterface : IMyInterface
    {
        new void DoSomething();
    }

其执行方式与隐藏继承的类成员一样。

在接口中定义的属性可以确定访问块get和/或set中的哪一个能用于该属性。

    interface IMyInterface
    {
        int MyInt
        {
            get;
            set;
        }
    }

注意:接口没有指定属性应如何存储。接口不能指定域,例如用于存储属性数据的域。

接口与类一样,可以定义为类的成员(但与接口的其他成员不同,因为接口不能包含类型定义)。

二、在类中执行接口

执行接口的类必须包含该接口所有成员的执行代码,且必须匹配指定的签名(包括匹配指定的get和set块),并且必须是公共的。

可以使用关键字virtual或abstract来执行接口成员,但不能使用static或const。例如:

    public interface IMyInterface
    {
        void DoSomething();
        void DoSomethingElse();
    }

    public class MyClass : IMyInterface
    {
        void IMyInterface.DoSomething()
        {}

        public void DoSomethingElse()
        {}
    }

接口成员还可以在基类上执行:

    public interface IMyInterface
    {
        void DoSomething();
        void DoSomethingElse();
    } 

    public class MyBaseClass
    {
        public void DoSomething()
        {}
    }

    public class MyDerivedClass : MyBaseClass,IMyInterface
    {
        public void DoSomethingElse()
        {}
    }

即通过另一类中定义相同签名并且符合实现接口的方法。

继承一个执行给定接口的基类,就意味着派生类隐式地支持这个接口,例如:

    public interface IMyInterface
    {
        void DoSomething();
        void DoSomethingElse();
    }

    public class MyBaseClass : IMyInterface
    {
        public virtual void DoSomething()
        {
            Console.WriteLine("MyBaseClass->IMyInterface->DoSomething()");
        }

        public virtual void DoSomethingElse()
        {
            Console.WriteLine("MyBaseClass->IMyInterface->DoSomethingElse()");
        }
    }

    public class MyDerivedClass : MyBaseClass
    {
        public override void DoSomethingElse()
        {
            Console.WriteLine("MyDerivedClass->MyBaseClass->IMyInterface->DoSomethingElse()");
        }
    }

在基类中把执行代码定义为虚拟,派生类就可以替换该执行代码,而不是隐藏它们。如果要使用new关键字隐藏一个基类成员,而不是重写它,则方法IMyInterface.DoSomething()就总是引用基类版本,即使派生类通过这个接口来访问,也是这样。

我们用下面这段代码测试上边的接口定义:

            MyBaseClass a = new MyBaseClass();

            a.DoSomething();

            a.DoSomethingElse();

            IMyInterface imi = a;

            imi.DoSomething();

            imi.DoSomethingElse();

            Console.WriteLine("\n");

            MyDerivedClass b = new MyDerivedClass();

            b.DoSomething();

            b.DoSomethingElse();

            imi = b;

            imi.DoSomething();

            imi.DoSomethingElse();

执行结果为:

 

三、显示执行接口成员

接口成员也可以由类显示的执行。如果这么做,该成员就只能通过接口来访问,不能通过类来访问。

    public interface IMyInterface
    {
        void DoSomething();
        void DoSomethingElse();
    }

    public class MyBaseClass : IMyInterface
    {
        void IMyInterface.DoSomething()
        {
            Console.WriteLine("MyBaseClass->IMyInterface->DoSomething()");
        } 

        public void DoSomethingElse()
        {
            Console.WriteLine("MyBaseClass->IMyInterface->DoSomethingElse()");
        }
    }

这样定义好后我们用如下代码进行执行:

            MyBaseClass a = new MyBaseClass();

            a.DoSomethingElse();

            IMyInterface imi = a;

            imi.DoSomething();

            imi.DoSomethingElse();

大家可以看下面的截图,对于DoSomething()我们只能通过接口才能访问。

类对象访问不到:


    
    接口对象可以访问到:

posted on 2008-04-07 14:46 二把刀 阅读(24) 评论(0)  编辑 收藏 网摘 所属分类: C#学习笔记

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-07 15:18 编辑过
Google站内搜索

相关文章:

相关链接: