C#精挑整理知识要点8 接口(建议收藏)

1.定义接口

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

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

接口定义了所有类继承接口时应遵循的语法合同接口定义了语法合同 “是什么” 部分,派生类定义了语法合同 “怎么做” 部分。

接口定义了属性、方法和事件,这些都是接口的成员。接口只包含了成员的声明。成员的定义是派生类的责任。接口提供了派生类应遵循的标准结构

多重继承的概念:

多重继承指的是一个类可以同时继承多个类。(多重继承在C++中支持,在C#和Java中不支持)

接口定义语法:

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

其中:

1) 接口名称

通常是以 I 开头,再加上其他的单词构成。例如创建一个计算的接口,可以命名为ICompute

2) 接口成员

接口中定义的成员与类中定义的成员类似。

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

  • 接口中的成员不允许使用 public、private、protected、internal 访问修饰符。

  • 接口中的成员不允许使用 static、virtual、abstract、sealed 修饰符。

  • 在接口中不能定义字段。

  • 在接口中定义的方法不能包含方法体。

例:

定义一个接口IWorker,其中包含一个动作叫DoWork;

interface IWorker
{
    void DoWork();
}

2.接口实现

1.接口的实现

接口的实现是通过继承的方式进行实现。

接口实现需要注意的地方:

  • 接口继承接口之后具有父接口的全部成员。

  • 类继承接口之后需要实现接口的全部成员方法。否则需要将该类定义为抽象类,

  • 未实现的接口方法定义为抽象方法。

  • 继承时基类和接口之间,接口和接口之间以逗号分隔

例:

class Person
{
    public Person()
    {
        name = "怡宝";
        age = 18;
        sex = "男";
    }
    
    public string name;
    public int age;
    public string sex;
    
    public void PrintPersonInfo(){
        Console.WriteLine("姓名:{0},性别:{1},年龄:{2}",name,age,sex);
    }
    
    public override string ToString()
    {
        return string .Format("姓名:{0},性别:{1},年龄:{2}",name,age,sex);
    }
}


//Student类继承于Person类和IWorker接口
class Student:Person,IWorker
{
    public Student()
    {
        classRoom = "204";
        course = "计算机";
    }
    
    string classRoom;
    
    string course;
    
    public void PrintStudentInfo()
    {
        base.name = "张无忌";
        base.PrintPersonInfo();
        Console.WriteLine("班级:{0},课程:{1}",classRoom,course);
    }
    
    //base的使用
    public override string ToString(){
        return string.Format("{0}\n姓名:{1},性别:{2},年龄:{3},班级:{4},课程:{5}",base.ToString(),name,age,sex,classRoom,course);
    }
    
    public void DoWork(){
        Console.WriteLine("在学习");
    }
}


 // 新增教师类,继承于Person类和IWorker接口
class Teacher : Person,IWorker
{
    public Teacher(string course)
    {
        this.course = course;
    }
    
    string course;
    
    public override string ToString()
    {
         //在名字后面加后缀
        base.name += "老师";
        return string.Format("{0}\n教授课程:{1}", base.ToString(), course);
    }
    
    //实现从接口继承的方法
    public void DoWork()
    {
        Console.WriteLine("正在上课");
    }
}


//主函数
static void Main(string[] args)
{
    Student stu = new Student();
        
    Teacher tea = new Teacher("计算机");
        
    PrintValue(stu);
    PrintValue(tea);
}
     
//修改参数类型为接口IWorker
static void PrintValue(IWorker p){
    Console.WriteLine(p.ToString());
    p.DoWork();
}
2.实现接口方式

接口的实现分为两种:显式实现接口和隐式实现接口

1)显式实现接口

​ 显式实现接口需要使用接口名作为方法名的前缀。

注意事项

​ a.显式实现接口时不需要指定访问修饰符。

​ b.显式实现的接口在调用时必须使用接口对象。

比如修改学生类显式实现接口:

//Student类继承于Person类和IWorker接口
class Student:Person,IWorker
{
    // 省略
    
    //实现从接口继承的方法
     void IWorker.DoWork()
     {
         Console.WriteLine("在学习");
     }
}


 Student stu = new Student();
//stu.DoWork(); 无法调用

IWorker worker = new Student();
worker.DoWork();

2)隐式实现接口

隐式实现接口不需要使用接口名作为方法名的前缀,但需要添加访问修饰符public

3)总结

  • 当类实现一个接口时,通常使用隐式接口实现,这样可以方便的访问接口方法和类自身具有的方法和属性。

  • 当类实现多个接口时,并且接口中包含相同的方法签名,此时使用显式接口实现。

  • 隐式接口实现,类和接口都可访问接口中方法。显式接口实现,只能通过接口访问

3.接口中多态的实现

多态能使用类之间的继承关系来实现,通过多个类继承同一个接口,并实现接口中的成员也能完成多态的表示。

使用接口实现多态 需要满足以下两个条件。

  • 定义接口并使用类实现了接口中的成员。

  • 创建接口的实例指向不同的实现类对象。

例:

/// <summary> 
/// 绘制图形的接口中包括图形面积、坐标、颜色属性, 
/// 并编写一个方法输出图形的描述 
/// </summary>

interface IShape
{
    /// <summary>
    /// 面积
    /// </summary>
    double Area{get;}
    /// <summary>
    /// X坐标
    /// </summary>
    double X{get;set;}
    /// <summary>
    /// 坐标Y
    /// </summary>
    double Y{get;set;}
    
    /// <summary>
    /// 颜色
    /// </summary>
    string Color{get;set;}
    
    /// <summary>
    /// 绘制方法
    /// </summary>
    void Draw();
    
}



    /// <summary>
    /// 矩形类,实现了接口IShape
    /// </summary>
    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);
    }
}


/// <summary>
/// 圆类,实现了接口IShape
/// </summary>
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 = 300;
        shape1.Y = 500;
        shape1.Color = "红色";
        shape1.Draw();
        
        Ishape shape2 = new Circle(10);
        shape2.X = 300;
        shape2.Y = 500;
        shape2.Color = "蓝色";
        shape2.Draw();
    }
}
  • 20
    点赞
  • 160
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

꧁小ۣۖิ鸽ۣۖิ子ۣۖิ꧂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值