C#接口

 
         接口把一组公共方法和属性组合起来 ,以封装特定功能的一个集合。通过类可以实现接口,这样类就支持接口所有的属性和方法。
        接口只能对方法和属性进行定义,不能实现,只能由支持它的类实现。接口中的成员不能用访问符修饰,如public,private,它的成员默认为public
        定义接口比较简 单
        public interface IMyinterface
        {
            void Dosomething();//方法成员
          int MyAttribute//属性成员
        {
                get;//这里只能定义这个属性是否为只读
                set;
            }
        }
       接口和抽象类比较相似,但一个类只能派生于一个抽象类,不过可以实现N个接口。


        举个例子来说明一下。
        有两个抽象类,car和train,,汽车和火车
        下面还有许多类,比如公交车,卡车等都派生于汽车
        客车,货车都派生于火车
        在car,train中公别定义了汽车与火车的一 些主要特性。
        自然的,它们的派生类就拥有这样的特性,
        但是汽车下的公交车,火车下的客车都可以乘载客人,所以这两个类可以共同实现一个拥有乘载客人功能的接口,而卡车与货车可以共同实现一个拥有运载货物的接口。


        一个类支持一个接品,就必须实现它所有的成员
 interface IMyinterface
 {
  void Dosomething();
  void Doelsething();
 }
    class Myclass1 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("1");
        }
       
    }
    class Myclass2 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("2");
        }
    }

 


上面定义了一个接口IMyinterface,  Myclass实现了这个接口, 这样,派生于Myclass的类Myclass2也就默认的支持这个接口,也继承了对方法的实现,在Myclass2中,还可以对Doelsething方法进行重写。
但这是有前提的。那就是Doelsething方法是由Myclass类隐式实现的。隐式实现只须匹配方法返回值和方法签名即可。这样的方 法,可以使用关健字vritual  和 abstract来修饰,而且可以用类的实例类调用                                             
class obj=new Myclass();
obj.Doelsethiing();

而第一个方法Dosomething是显式执行的。它只能由接口的引用变量来调用。而且派生类不会继承这个方法的实现,所以上面的Myclass2类也要再加一个这个方法的实现 ,因为它继承了Myclass,就默 认的支持这个接口。
 

那接口有什么作用呢?

如下例:

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

namespace ConsoleApplication1
{
    interface IMyinterface
    {
        void Dosomething();
    }
    class Myclass1 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("1");
        }
       
    }
    class Myclass2 : IMyinterface
    {
        public void Dosomething()
        {
            Console.WriteLine("2");
        }
    }

    class Program
    {
        /// <summary>
        ///
        /// </summary>
        /// <param name="im1"></param>   注意:此参数为接口类型,但继承此接口的类的实例都可以作为参数传递
        private static  void WriteLine1(IMyinterface im1)
        {
            im1.Dosomething();


        }

        static void Main(string[] args)
        {
            Myclass1 mc1 = new Myclass1();
            WriteLine1(mc1); // Myclass1的实例可以作为参数
            Myclass2 mc2 = new Myclass2();
            WriteLine1(mc2); // Myclass2的实例也可以作为参数,而不必重载WriteLine1方法
            Console.Read();
          
        }
    }
  
}

由上例可看出,接口作为参数时,不必重载方法.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章