C#中的 接口与类

       在C#中类的声明与C++和Java很相似。但是,不像C++,C#结构体与类是不支持继承多个父类。但是,与Java相同的是,一个结构体可以实现接口(interface)。Java的关键字import已经被替换成using,它起到了同样的作用。    

 类的介绍在此不过多的说明,简要的说明一下接口。

        接口用来定义类的标准和规范,是一种约束形式。主要的目的是为不相关的类提供通用的处理服务,由于C#中只允许单一继承,即一个类只能有一个父类,所以接口是让一个类具有两个及以上基类的唯一方式。接口可以从多个基接口继承,接口可以包含方法、属性、事件和索引器申明,接口本身不提供它所定义的成员的实现,这也是接口为什么不包含字段成员变量的原因。

定义接口的语法格式是:

[访问修饰符] interface 接口名称 [基接口]

{

  //接口体

}

实现接口具体实例如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hello
{
    //定义两个接口
    interface IMyexample1
    {
        int add(int x,int y);
    }
    interface IMyexample2
    {
        string Point { get; set; }
    }

    class mytest:IMyexample1,IMyexample2
    {  //类继承于多个接口
        private string mystr;
        public  mytest(string s)
        {
            mystr = s;
        }
        //实现接口IMyexample1中的方法 dd(int x,int y)
        public int add(int x,int y)
        {
            return x + y;
        }
        //实现接口IMyexample2中的方法Point { get; set; }
        public string Point
        {
            get { return mystr; }
            set { mystr = value; }
        }
    } 
    class Program
    {
        static void Main(string[] args)
        {
            mytest a = new mytest("Hello");

            Console.WriteLine(a.add(23,4));
            Console.WriteLine(a.Point);
            Console.Read();    
        }
    }
}
运行结果为
27
Hello

此外,不同点:

不能直接实例化接口。

接口不包含方法的实现。

接口可以多继承,类只能单继承。

类定义可在不同的源文件之间进行拆分。

 

相同点:

接口、类和结构都可以从多个接口继承。

接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。

接口和类都可以包含事件、索引器、方法和属性。

显示接口成员实现

      当类实现接口时,如给出了接口成员的完整名称即带有接口名前缀,则称这样实现的成员为显示接口成员,其实现被称为显示接口成员实现。

     显示成员实现中使用访问修饰符属于编译错误,即不能包含public、abstract、virtual、override或static等修饰符

    显示接口成员实现具有与其他成员不同的可访问性特征,不能直接访问“显示接口成员实现”成员,即使使用它的完全限定名也不行。“显示接口成员实现”的成员只能通过接口的实例访问,并在通过接口的实例访问时,只能用该接口成员的简单名称来引用。

接口成员显示实现示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hello
{
    interface Ia  //申明接口Ia
    {
        float getarea();  //接口成员声明
    }
    public class Rectangle: Ia   //类Rectangle继承接口Ia
    {
        float x, y;
        public Rectangle(float x1,float y1) //构造函数
        {
            x = x1;
            y = y1;
        }
        float Ia.getarea()  //显示接口成员实现,带有接口名前缀,不能使用public
        {
            return x * y;
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            Rectangle box1 = new Rectangle(2.5f,3.0f);
            Ia ia = (Ia)box1;
            Console.WriteLine("长方形面积:{0}",ia.getarea());
        }
    }
}
运行结果

长方形面积:7.5