什么是接口?

本文详细阐述了接口与类的概念及区别,并通过一个具体的C#示例展示了如何使用接口来扩展类的功能。
接口的概念:接口是一组包含了函数型方法的数据结构。通过这组数据结构,客户代码可以调用组件对象的功能。
其实我认为概念是在自己正真用它的时候才能够彻底理解的,光看上面的概念即使是你倒背如流我也认为你不理解接口是什么东西。
其实接口就是一个类,我们可以认为它就是用interface代替了class的一个类,所以他的声明语法都是和类一样的。但是它是一个特殊的类,特殊之处就在它只声明成员,而不具体实现。所以不能创建这个类(接口)的对象。而继承自接口的类必须实现接口的所有方法。
呵呵……
是不是感觉在说抽象类啊?
是的,这看起来有点像抽象类,抽象类也不能实例化,而且要求派生类实现其抽象方法。但是两者是有区别的。
抽象类的功能要比接口多,抽象类可以有子类继承,而且可以包含状态数据和具体方法。
那么到底是用接口还是用类,就个人经验来说:
(只是自己的经验奥,所以大家可以指点和补充……呵呵……)
决定因素:类型与其继承子类之间的关系。
接口:为类定义一种行为,即它“能干什么”,内置的.net ICloneable接口就是这样一个例子。它允许对象创建自身的副本
类:当继承子类是“一种”基类时,就应该用类,
例如:可以创建一个shape类做为基类,创建circle做为shape的子类,而将改变形状大小的功能做为一个接口方法。
除了作用不同外,类和接口还有许多不同。

  • 接口不能从类继承。而类是可以的……
  • 接口可以继承多个接口,而类是不可以的,大家都知道c#是不支持多继承的,它不和c++一样,这是因为它不支持多继承,而可以继承自多个接口,所以接口的概念在c#中就要比c++中要觉得重要一些……
  • 类可以继承多个接口,但是只能继承一个类……
  • 接口成员必须是方法,成员属性,事件或索引器。
  • 所有接口成员必须能public访问
  • 根据命名约定,接口名必须以大写I开头


本来想举个例子,编个小的程序的,呵呵……
可是偷点懒了……
lz可以到网上去找找,应该很多的,我这里就不给你写了,其实写也是复制粘贴的,我实在是自己不想写了……
其实个人觉得在系统的整个设计中,真正的问题不是选择类还是接口,而是然后最佳的结合使用类和接口,c#不允许多重继承,这使得接口的用途更广,倘若把所需的全部功能过呢都加载到一个基类中,或者建立基类的层次体系来实现所需的全部功能,就实在太费劲了。
更好的解决方法是定义一个基类,然后增加相应的接口来扩展其功能,这样,开发人员就可以直接使用类,而无需考虑方法是否为接口实现(即对接口中方法的具体实现)、另外,开发人员也可以只利用接口,而忽略其他类成员。
当然,你必须认识到使用接口的不足之处,首先设计良好的基类可以提升代码重用性,从而减轻继承子类的实现负担,另外,非抽象类可以增加成员,而不影响已有的派生类,而向接口增加成员的话,则实现该类的所有类都会受到影响。
………………
也就这么多吧……
要是有什么不足地方大家补补……

 

 

举个例子:

 

using System;
using System.Collections.Generic;
using System.Text;

namespace ConsoleApplication1
{
    public interface IshapeFunction  //定义一个接口;
    {
        double GetArea();//定义一个没有实现只有声明的方法,
    }
    class circle : IshapeFunction  //circle继承自IshapeFunction接口,他必须实现IshapeFunction接口中的GetArea()方法;
    {
        private double radius;  //定义半径
        public circle(double rad)    //初始化半径
        {
            radius = rad;
        }
        public double GetArea()      //实现接口中的方法
        {
            return (Math.PI * radius * radius);   //求出面积
        }
        public string ShowMe()   //显示自己
        {
            return ("Circle");
        }
    }
    class Rectangle : IshapeFunction  //Rectangle继承自IshapeFunction接口,他必须实现IshapeFunction接口中的GetArea()方法;
    {
        private double width, height;//定义长和宽
        public Rectangle(double myWidth, double myHeight)//初始化长宽
        {
            width = myWidth;
            height = myHeight;
        }
        public double GetArea()  //求出面积
        {
            return (width * height);
        }
        public string ShowMe()   //显示自己
        {
            return ("Rectangle");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            circle myCircle = new circle(4);  //声明一个circle对象
            IshapeFunction myICircle = myCircle;//创建一个变量,它引用了这个circle对象,不过,由于这个变量指定为IshapeFunction类型,所以它只能访问该接口的成员。这就是所谓的“接口类型”,通过用接口类型,可以有效的创建过滤器,从而限制只能对接口成员进行访问。
            Rectangle myRectangle = new Rectangle(4, 8);//声明一个Rectangle对象。
            IshapeFunction[] myShapes ={ myCircle, myRectangle };//使用接口最大的好处之一在于,程序员可以用相同的方式处理不同的类,只要它们实现相同的接口就可以,下面演示这个功能。
            
            
            Console.WriteLine(myShapes[0].GetArea().ToString());
            Console.WriteLine(myShapes[1].GetArea().ToString());

            Console.WriteLine(myCircle.GetArea().ToString());  //打印mycircle的面积
            Console.WriteLine(myRectangle.GetArea().ToString());//打印myrectangle的面积

            Console.WriteLine(myCircle.ShowMe());
            Console.WriteLine(myRectangle.ShowMe());

            Console.WriteLine(myICircle.GetArea().ToString());
            // Console.WriteLine(myICircle.ShowMe());  上面的可以通过,下面提示出错,因为通过接口类型创建了过滤器,限制只能对接口成员进行访问。
            System.Threading.Thread.Sleep(100000);
        }
    }
}

转载于:https://www.cnblogs.com/djxhyj/archive/2008/11/30/1344435.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值