C#学习教程07——接口

7.接口

在C#语言中,类之间的继承关系仅支持单重继承,而接口是为了实现多重继承关系设计的。

7.1 定义接口

一个类能同时实现多个接口,还能在实现接口的同时再继承其他类,并且接口之间也可以继承。

无论是表示类之间的继承还是类实现接口、接口之间的继承,都使用:来表示。

interface  接口名称
{
    接口成员;
}

接口中定义的成员必须满足以下要求。

  • 接口中的成员不允许使用public、private、protected、internal访问修饰符。
  • 接口中的成员不允许使用static、virtual、abstract、sealed修饰符。
  • 在接口中不能定义字段。
  • 在接口中定义的方法不能包含方法体。

不能直接创建接口的实例,只能通过类实现接口中的方法。

interface ICompute
{
    int Id { get; set; }
    string Name { get; set; }
    void Total();
    void Avg();
}

7.2 实现接口

在类中实现一个接口时必须将接口中的所有成员都实现,否则该类必须声明为抽象类,并将接口中未实现的成员以抽象方式实现。

class  类名 : 接口名
{
    //类中的成员以及实现接口中的成员
}

在实现接口的成员时有两种方式,一种是隐式实现接口成员,一种是显式实现接口成员。

在实际应用中隐式实现接口的方式比较常用,由于在接口中定义的成员默认是public类型的,隐式实现接口成员是将接口的所有成员以 public访问修饰符修饰。

// 隐式方式实现接口
using System;
interface ICompute
{
    int Id { get; set; }
    string Name { get; set; }
    void Total();
    void Avg();
}
class ComputerMajor : ICompute
{
    public int Id { get; set; }     //隐式实现接口中的属性
    public string Name { get; set; }    //隐式实现接口中的属性
    public double English { get; set; }
    public double Programming { get; set; }
    public double Database { get; set; }
    public void Avg()       //隐式实现接口中的方法
    {
        double avg = (English + Programming + Database) / 3;
        Console.WriteLine("平均分:" + avg);
    }
    public void Total()		//隐式实现接口中的方法
    {
        double sum = English + Programming + Database;
        Console.WriteLine("总分为:" + sum);
    }
}
class Program
{
    static void Main(string[] args)
    {
        ComputerMajor computerMajor = new ComputerMajor();
        computerMajor.Id = 1;
        computerMajor.Name = "李明";
        computerMajor.English = 80;
        computerMajor.Programming = 90;
        computerMajor.Database = 85;
        Console.WriteLine("学号:" + computerMajor.Id);
        Console.WriteLine("姓名:" + computerMajor.Name);
        Console.WriteLine("成绩信息如下:");
        computerMajor.Total();
        computerMajor.Avg();
    }
}
// 学号:1
// 姓名:李明
// 成绩信息如下:
// 总分为:255
// 平均分:85

显式实现接口是指在实现接口时所实现的成员名称前含有接口名称作为前缀。使用显式实现接口的成员不能再使用修饰符修饰,即 public、abstract、virtual、 override等。

// 显示方式实现接口
using System;
interface ICompute
{
    int Id { get; set; }
    string Name { get; set; }
    void Total();
    void Avg();
}
class ComputerMajor : ICompute
{
    public double English { get; set; }
    public double Programming { get; set; }
    public double Database { get; set; }
    int ICompute.Id { get; set; }           //显示实现接口中的属性
    string ICompute.Name { get; set; }      //显示实现接口中的属性
    void ICompute.Total()                   //显示实现接口中的方法
    {
        double sum = English + Programming + Database;
        Console.WriteLine("总分数:" + sum);
    }
    void ICompute.Avg()
    {
        double avg = (English + Programming + Database) / 3;
        Console.WriteLine("平均分为:" + avg);
    }
}
class Program
{
    static void Main(string[] args)
    {
        ComputerMajor computerMajor = new ComputerMajor();
        ICompute compute = computerMajor;       //创建接口的实例
        compute.Id = 1;
        compute.Name = "李明";
        computerMajor.English = 80;
        computerMajor.Programming = 90;
        computerMajor.Database = 85;
        Console.WriteLine("学号:" + compute.Id);
        Console.WriteLine("姓名:" + compute.Name);
        Console.WriteLine("成绩信息如下:");
        compute.Total();
        compute.Avg();
    }
}
// 学号:1
// 姓名:李明
// 成绩信息如下:
// 总分为:255
// 平均分:85
接口抽象类
在接口中仅能定义成员,但不能有具体的实现。抽象类除了抽象成员以外,其他成员允许有具体的实现。
在接口中不能声明字段,并且不能声明任何私有成员,成员不能包含任何修饰符。在抽象类中能声明任意成员,并能使用任何修饰符来修饰。
接口能使用类或者结构体来继承。抽象类仅能使用类继承。
在使用类来实现接口时,必须隐式或显式地实现接口中的所有成员,否则需要将实现类定义为抽象类,并将接口中未实现的成员以抽象的方式实现。在使用类来继承抽象类时允许实现全部或部分成员,但仅实现其中的部分成员,其实现类必须也定义为抽象类。
一个接口允许继承多个接口。一个类只能有一个父类。

7.3 接口中多态的实现

通过多个类继承同一个接口,并实现接口中的成员也能完成多态的表示。

using System;
interface IShape
{
    double Area { get; }
    double X { get; set; }
    double Y { get; set; }
    string Color { get; set; }
    void Draw();
}
class Rectangle :IShape
{
    //为矩形的长和宽赋值
    public Rectangle(double length,double width)
    {
        this.Length = length;
        this.Width = width;
    }
    public double Length { get; set; }//定义长方形的长度
    public double Width { get; set; }//定义长方形的宽度
    public double Area
    {
        get
        {
            return Length * Width;//计算长方形面积
        }
    }
    //隐式实现接口中的属性
    public string Color { get; set; }
    public double X { get; set; }
    public double Y { get; set; }
    //隐式实现接口中的方法
    public void Draw()
    {
        Console.WriteLine("绘制图形如下:");
        Console.WriteLine("在坐标({0},{1})的位置绘制面积为{2}颜色为{3}的矩形", X, Y, Area, Color);
    }
}
class Circle : IShape
{
    //为圆的半径赋值
    public Circle(double radius)
    {
        this.Radius = radius;
    }
    public double Radius { get; set; }
    public double Area
    {
        get
        {
            return Radius * Radius * 3.14;
        }
    }
    public string Color { get; set; }
    public double X { get; set; }
    public double Y { get; set; }
    public void Draw()
    {
        Console.WriteLine("绘制图形如下:");
        Console.WriteLine("在坐标为({0},{1})的位置绘制面积为{2}颜色为{3}的圆形", X, Y, Area, Color);
    }
}
class Program
{
    static void Main(string[] args)
    {
        IShape shape1 = new Rectangle(10, 20);
        shape1.X = 100;
        shape1.Y = 200;
        shape1.Color = "红色";
        shape1.Draw();
        IShape shape2 = new Circle(10);
        shape2.X = 300;
        shape2.Y = 500;
        shape2.Color = "蓝色";
        shape2.Draw();
    }
}
// 绘制图形如下:
// 在坐标(100,200)的位置绘制面积为200颜色为红色的矩形
// 绘制图形如下:
// 在坐标为(300,500)的位置绘制面积为314颜色为蓝色的圆形

版权声明:本文为weixin_46003347原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。