C#中类与接口的区别讲解

 更新时间:2022年04月20日 14:38:59   作者:農碼一生  
本文详细讲解了C#中类与接口的区别,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、抽象类

抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。

注意:

1.抽象方法,必须存在于抽象类当中。相反,抽象类中不一定全部是抽象方法。
2.抽象方法没有方法体,继承了抽象类的子类,必须实现父类的所有的抽象方法。
3.抽象类可以被实例化,但不能通过普通的实例化new,它只能通过父类的应用指向子类的实例来间接的实例化子类。如:

Person t = new Teacher();

二、接口

接口是引用类型的,类似于类,接口内包含的全部是未实现的方法,而且接口类和方法的关键词不需要再声明abstract。和抽象类的相似之处有三点:
1.不能实例化;
2.包含未实现的方法声明;
3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。
除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。

三、抽象类和接口的相同点和不同点

不同点:接口不包含方法的实现,抽象类可以包含,也可以不包含,不包含时非抽象方法时{}必须保留。
接口可以多继承,类只能单继承。
类定义可在不同的源文件之间进行拆分。
相同点:都不能进行实例化,必须通过继承实现其抽象方法。
接口、类和结构都可以从多个接口继承。
接口类似于抽象基类:继承接口的任何非抽象类型都必须实现接口的所有成员。
接口和类都可以包含事件、索引器、方法和属性。

四、代码案例

抽象类:

namespace ClassDemo1
{
    
    #region 类
    public abstract class Person
    {
        //函数即使对象的动作
        public void Breath()
        {
            //空方法体
        }
        public void Name()
        {
            Console.WriteLine("人人都有姓名!");
        }
        public virtual void Drink() // 注意virtual,表明这是一个虚拟函数
        {
            Console.WriteLine("人是要喝水的!");
        }
        public void Eat()
        {
            Console.WriteLine("人是要吃饭的!");
        }
        public void Sleep()
        {
            Console.WriteLine("人是要睡觉的!");
        }
    }
    public  class Teacher :Person 
    {
        //重定义父类方法
        public new  void Eat()
        {
            Console.WriteLine("教师是人,也是要吃饭的!");
        }
        //重写父类方法
        public override void Drink()
        {
            Console.WriteLine("教师是人,也是要喝水的!");
        }
        //自己独有方法(动作)
        public void Teach()
        {
            Console.WriteLine("教师的义务是要进行教授课程!");
        }
    }
    #endregion
    //测试
    class Program
    {
        static void Main(string[] args)
        {
            Teacher t = new Teacher();
            t.Breath();
            t.Name();
            t.Drink();
            t.Eat();
            t.Sleep();
            t.Teach();
            Console.ReadKey();
        }
    }
}

接口:

namespace InterfaceDemo1
{
    #region 接口
    //不能进行实例化,只能通过继承实现其抽象方法
    //还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。
    //除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。

    //定义学生接口
    public interface IStudent
    {
        //未实现的方法声明;
         void study_base();
    }
    //定义职员接口
    public interface IEmployee
    {
        void work();
    }
    //定义计算机类学生接口
    public interface IIStudent : IStudent
    {
        void study_computer();
    }

    //接口能实现多继承,子类必须实现继承接口的所有方法
    public class Infostudent : IEmployee, IIStudent
    {
        //实现学生接口
        public void study_base()
        {
            Console.WriteLine("数学、语文和英语必须学好");
        }
        //实现职员接口
        public void work()
        {
            Console.WriteLine("工作必须完成");
        }
        //实现计算机类学生接口
        public void study_computer()
        {
            Console.WriteLine("计算机类的学生除学好基础课外,还要学C#");
        }

        //自己定义的方法
        public void play_game()
        {
            Console.WriteLine("计算机类的学生除学好基础课外和学C#外,还喜欢打游戏");
        }
        
    }

    #endregion

    //测试
    class Program
    {
        static void Main(string[] args)
        {
            //派生与接口的学生类
            Infostudent infostudent = new Infostudent();
            infostudent.study_base();
            infostudent.work();
            infostudent.study_computer();
            //学生自己独有的方法
            infostudent.play_game();

            Console.ReadKey();
        }
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用C#实现将CSV文件内容装配成对象列表

    使用C#实现将CSV文件内容装配成对象列表

    这篇文章主要为大家详细介绍了如何使用C#实现将CSV文件内容装配成对象列表,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • windows系统下,如何在C#程序中自动安装字体

    windows系统下,如何在C#程序中自动安装字体

    在Windows系统中,原有自带的字体样式有限,有时候我们的程序会使用到个别稀有或系统不自带的字体。因此我们需要将字体打包到程序中,当程序启动时,检测系统是否有该字体,如果没有则安装该字体,也可以动态加载字体。
    2020-11-11
  • C#判断ip地址是否可以ping的通

    C#判断ip地址是否可以ping的通

    这篇文章主要介绍了ip地址是否可以ping的通的方法,使用到了C#,需要的朋友可以参考下
    2014-06-06
  • c#:CTS类型系统

    c#:CTS类型系统

    CTS通用类型系统,是.Net中一套定义类型的规则。我们要掌握c#开发,首先要建立这个类型概念,只有知道c#的元素是什么类型,才能进行相关的分析和选材。
    2012-12-12
  • C#实现简单成绩管理系统的完整步骤

    C#实现简单成绩管理系统的完整步骤

    这篇文章主要给大家介绍了关于C#实现简单成绩管理系统的完整步骤,文中通过示例代码介绍的非常详细,对大家的学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-11-11
  • 关于C#中GUI编程的标准事件问题

    关于C#中GUI编程的标准事件问题

    这篇文章主要介绍了C#中GUI编程的标准事件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-01-01
  • c#编写的高并发数据库控制访问代码

    c#编写的高并发数据库控制访问代码

    往往大数据量,高并发时, 瓶颈都在数据库上, 好多人都说用数据库的复制,发布, 读写分离等技术, 但主从数据库之间同步时间有延迟.
    2015-03-03
  • 浅析WPF中控件拖拽与拖动的实现

    浅析WPF中控件拖拽与拖动的实现

    这篇文章主要为大家详细介绍了如何在WPF中实现控件拖拽与拖动的功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • C# 忽略大小写进行字符串比较

    C# 忽略大小写进行字符串比较

    这篇文章主要介绍了C# 字符串比较忽略大小写的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下
    2021-02-02
  • C# Dynamic关键字之:调用属性、方法、字段的实现方法

    C# Dynamic关键字之:调用属性、方法、字段的实现方法

    本篇文章是对C#中调用属性、方法、字段的实现方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05

最新评论