接口 interface

本文介绍了在C#中如何使用接口实现多态,并通过实例详细解释了接口作为一种规范和能力的概念。探讨了接口与类的区别,以及接口在实现多继承方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<1>

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

namespace interface接口
{

    //接口什么时候用? 当一个类需要多继承的时候就要考虑用接口了。因为类是单继承的。而接口是可以多继承的。

    //接口是一种规范,同时也是一种“能力” 。怎么理解这个能力呢?打个比方,有一个“人”的类。“人”这个类有 “吃”“喝”“拉”“撒”等方法。 一个人就只能干这些事情。但是我现在想打篮球。那么就可以考虑写一个接口。让这个接口实现“打篮球”这个能力 然后让这个“人”这个类来继承这个接口就行了。(那么有人就要问了,我直接在“人”这个类里添加一个“打篮球的方法不就行了吗”? 的确是可以这样,但是有的人要打篮球,可是有的人不要打篮球,他要踢足球呢?所以,这里同样也可以将“踢足球”这个功能写成一个接口。谁想要什么功能直接去继承想要功能就可以了)
	
	//那怎么理解接口是一种规范呢? 答案: 假如我定义了一个接口,里面有5个抽象方法。 那现在有2个类都继承了这个接口,既然这两个类都继承了这个接口,那么他们都需要实现这个接口中的5个抽象方法,所以这就保证了,这两个类中都会有接口中的5个方法,这就是一种规范


    //接口的声明 接口的名字一般是以“I”开头 以“able”结尾表示能力。

    
        //接口中的成员不允许添加访问修饰符。默认的就是public
        //接口中有方法,但是不能有方法体。它的方法只能在继承它的类中实现此方法。
        //接口中的方法都必须是abstract的
        //接口中方法可以有返回值
        //接口中可以有“属性”,“索引器”,“事件”和“方法”。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。(其实属性,索引器和事件的本质就是方法。所以说接口中就只能有方法)

        
        //接口是多继承的。一个类只能继承一个类,但是可以继承多个接口。同样,接口也可以继承接口,但是接口不能继承类。
        //如果一个类A同时继承了类B,和接口Icable的时候,那么在语法上类B必须写在Icable前面;示例:public class A:B,Icable

        //一个类继承一个接口,就必须要实现接口中的所有的成员。

        //为了多态,接口是不能被实例化的。即:Idalanqiuable da=new Idalanqiuable()是错误的。因为接口中的成员都是没有方法体的,也就是说都没有实现的。如果能创建对象来调用自己的方法,没有一点意义。所以就规定接口是不能被实例化。要想实现多态,那么就将 Idalanqiuable 指向一个子类对象;即:Idalanqiuable d=new Person() 用d来调用接口中的方法(实际调用的是子类实现了的接口方法)
        
        //总结一下,抽象类,静态类,和接口是不能被实例化的。




    //-----------------------------------//声明一个打篮球功能的接口
    
    public interface Idalanqiuable 
    {
        void Dalanqiu(); 
        string Test();

        string Name { get; set; } //属性其实是由get方法,和set方法组成的。注意:这个Name属性是一个自动属性,它里面的get方法和set方法都是没有方法体的。
        
        //string Name 错误,接口中不能包含字段
    }



    //-----------------------------------//声明一个踢足球功能的接口


    public interface Itizuqiuable   
    {
        void Tizuqiu();
    }


    //-----------------------------------//声明一个超级功能的接口。这个接口还同时继承了踢足球和打篮球功能的接口。


    public interface ISuperable : Idalanqiuable, Itizuqiuable //之所以要声明这个接口是要展示:接口可以继承接口
    {
        void All();
    }




    //-------------------------------------------声明一个Student类。这个Student类继承了这个超级接口。而这个超级接口又继承了两个其他的接口,所有这个Student类就要全部实现这个超级接口的所有成员,及超级接口继承了其他接口的所有成员

    public class Student:ISuperable   //之所以声明这个类主要用来展示:一个类继承一个超级接口的时候,它需要实现超级接口所有方法,及超级接口所继承的其他接口的所有方法
    {

        public void Dalanqiu() //实现Idalanqiuable接口中的方法。
        {
            Console.WriteLine("我会打篮球");
        }

        public string Test() //实现Idalanqiuable接口中的方法。
        {
            return "测试接口中的方法是可以有返回值的";
        }

        public string Name { get; set; }//实现Idalanqiuable接口中的属性


        public void Tizuqiu()  //实现Itizuqiuable接口中的方法。
        {
            Console.WriteLine("我会踢足球");
        }

        public void All() //实现ISuperable接口中的方法。
        {
            Console.WriteLine("我是超级接口的方法,我本事可大了。可以吃喝拉撒");
        }
    }






    //----------------------------------//声明一个Person类。让他继承Idalanqiuable 打篮球功能接口。



    public class Person : Idalanqiuable  //Person必须实现Idalanqiuable接口的所有成员
    {
        public void SayHello()
        {
            Console.WriteLine("大家好,我是一个人");
        }

        public void Dalanqiu() //实现Idalanqiuable接口中Dalanqiu()这个抽象方法
        {
            Console.WriteLine("我会打篮球");
        }

        public string Test() //实现Idalanqiuable接口中Test()这个抽象方法
        {
            return "测试接口中的方法是可以有返回值的";
        }

        public string Name { get; set; } //实现Idalanqiuable接口中的Name属性
    }



    //------------------------------------------入口、Main函数

    class Program
    {
        static void Main(string[] args)
        {

            Idalanqiuable d = new Person(); //这里new了一个Person对象
            d.Dalanqiu(); // 调用接口中的Dalamqiu()方法。其实实际上调用的是子类实现了的接口方法。:注意,这里的d只能调用Idalanqiuable中定义的方法成员(虽然最终实际上是调用子类的同名方法) 不能调用子类的其他方法成员 -----这里输出:我会打篮球
            //d.SayHello()错误。无法调用子类的独有的方法。

            //d.Name = "张三";

            //Console.WriteLine(d.Name);


            Person p = new Person(); // 这里又new了一个Person对象。注意:这个p与d是完全不相干的两个对象。
            p.Dalanqiu();
            p.Test();
            p.SayHello();
            p.Name = "李四"; //这里给p这个对象的Name属性赋值
            Console.WriteLine(p.Name); //输出:李四。

            Console.WriteLine(d.Name); //因为d这个对象的Name属性没有赋值。所以这里什么也不会输出
            Console.ReadKey();
        }
    }
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值