C# 接口学习

最近看《大话设计模式》中有的地方使用抽象类,有的地方使用接口,一直在想到底在什么地方使用抽象类,在什么地方使用接口。在下面将接口和抽象类的特点和区别做一个总结,以供日后复习使用。首先先写下对接口的收集到的知识。

 

接口是为一个行为提供相应的规范和规定,微软的自定义接口总是后带able字段,证明其表述有同样“我能做……”行为的类。接口大多数是在关系疏松但都实现某一功能的类中。

 

一、接口的特点

1、接口是引用类型

2、接口不能被实例化

3、接口包含未实现的方法声明

4、接口除了包含方法以外,可以包括属性索引器事件,并且这些成员都必须是公有的(Public)。但是不能包括:常量、域、构造函数、静态成员。

5、派生类必须实现接口中的所有成员(不仅是方法,还包括其它成员)。

6、一个类可以直接继承多个接口。

 

二、接口的使用

1、在创建的功能将在大范围不同对象中使用的时候,使用接口。

2、设计小而简练的功能块,使用接口。

3、接口适用与为不相关的类提供通用的功能。

 

三、示例

1、形象的比喻。飞机会飞,鸟会飞,他们都继承了同一个接口“飞”。

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            IFlyable plane = new Plane();
            plane.fly();

            IFlyable bird = new Bird();
            bird.fly();

            Console.ReadKey();
        }
    }

    interface IFlyable
    {
        void fly();
    }

    class Plane : IFlyable
    {
        public void fly()
        {
            Console.WriteLine("I'm a plane,I'm flying!!");
        }
    }

    class Bird : IFlyable
    {
        public void fly()
        {
            Console.WriteLine("I'm a bird,I can Fly!!");
        }
    }


}

 

2、私有方法不能呢个实现接口方法

如果想将接口方法直接实现为私有方法是办不到的。下面的EditBox的代码中的Paint方法没有特殊说明,默认为Private,导致代码无法执行。

接口方法的实现通常是通过类中的公有方法实现的;在一些特殊情况下(代码隐藏、一个类实现的两个接口具有相同的接口方法等),需要专门实现某个接口的方法。

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            EditBox editBox = new EditBox();
            editBox.ShowPaint();
        }
    }

    interface IControlable
    {
        void Paint();
    }

    public class EditBox : IControlable
    {
        void Paint()
        {
            Console.WriteLine("Pain method is called!");
        }

        public void ShowPaint()
        {
            this.Paint();

            ((IControlable)this).Paint();
        }
    }
    
}

程序在编译的时候显示出编译错误:

image

这是由于接口规范中的方法默认的访问权限是Public,而类中的默认访问权限是default,也就是Private,因此导致权限范围收缩,两者权限不相同,所以必须将类的权限调整为Public才可以使上面的代码得以执行。

 

3、实现专门的接口方法-1

代码:

using System;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            EditBox editBox = new EditBox();
            editBox.ShowPaint();

            Console.ReadLine();
        }
    }

    interface IControlable
    {
        void Paint();
    }

    public class EditBox : IControlable
    {
        void Paint()
        {
            Console.WriteLine("Pain method is called!");
        }
        void IControlable.Paint()
        {
            Console.WriteLine("IControlable.Pain method is called.");
        }

        public void ShowPaint()
        {
            this.Paint();

            ((IControlable)this).Paint();
        }
    }
    
}

输出结果:

image

 

注意:在 void IControlable.Paint() 不能加任何的修饰限定符号,诸如PublicPrivate等。

posted @ 2012-11-15 14:55  地山谦  阅读(202)  评论(0编辑  收藏  举报