• C#中类和接口的区别


    C#中类和接口的区别

    一、抽象类

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

    注意:

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

      Person t = new Teacher();

    二、接口

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

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

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

    四、代码案例

    抽象类:

    namespace ClassDemo1
    {
        
        #regionpublic 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();
            }
        }
    }

    技术的发展日新月异,随着时间推移,无法保证本博客所有内容的正确性。如有误导,请大家见谅,欢迎评论区指正!
    我创建了一个.NET开发交流群,用于分享学习心得和讨论相关技术难题。欢迎有兴趣的小伙伴扫码入群,相互学习!

  • 相关阅读:
    log4j.appender.stdout.layout.ConversionPattern
    log4j:WARN No appenders could be found for logger
    Eclipse中TODO的分类,以及自动去除
    Java泛型类型擦除导致的类型转换问题
    Java中泛型数组的使用
    Java泛型中的通配符的使用
    Java泛型类定义,与泛型方法的定义使用
    Java泛型的类型擦除
    jQuery查询性能考虑
    jQuery判断checkbox是否选中
  • 原文地址:https://www.cnblogs.com/wml-it/p/14840565.html
Copyright © 2020-2023  润新知