C#之抽象类、虚方法、重写、接口、密封类

来源:互联网 发布:电脑远程开机软件 编辑:程序博客网 时间:2024/04/28 02:10

前言

   学了这么长时间的C#,我想说对于这个东东还是不是特别了解它,以至于让我频频郁闷。每次敲代码的时候都没有一种随心所欲的感觉。所以不得不在网上搜集一些资料,look 了 look~

内容

   接触了C#很长时间了,现在总结一下C#类关键字(abstract、virtual、override、sealed(这是新接触的)、new)的使用和它的体现。
1、C#中用abstract声明抽象类、抽象方法:
  • 抽象类不能直接实例化,必须由派生类实现。
  • 抽象方法所在类必须为抽象类。
  • 抽象方法中不包含方法主体,声明的方法为虚方法,必须由派生类以override(重写)实现此类方法。
  • 抽象方法没有方法主体;
2、virtual关键字
  • 首先用virtual声明的虚方法可以被子类重写。
  • 在派生类用override覆盖此方法;
  • 不覆盖也可由对象调用;
  • 有些方法无此关键字声明,在在派生类调用的时候要用new关键字隐藏原方法;
  • abstract和virtual:方法重写的时候都要求用override进行重写;interface的方法和abstract方法都要求实现。
3、sealed关键字
  • 当对一个类应用sealed关键字的时候,这个修饰符会阻止其他类从该类继承,类似于Java中的final关键字;
4、密封类
  • 在C#中的密封类是指该类不能被继承;
  • 在密封类中的方法不能再次定义为密封的;
  • 密封类不能用作基类,因此也能定义为抽象类,在运行调用时速度较快;
  • 主要作用是防止派生;

实践

   根据上面的理解,在网上找了相应的例子,敲这个例子到调试好,大概花费了一上午的时间。感觉从这个例子中学到了很多。从中也投射出UML中类图与接口之间的调用;对抽象类的继承;对接口的实现;明白了虚方法与方法的重写;对功能的封装。。。中间遇到问题后,问了问荣凯大神,他上来就问我想要干嘛!!!我说我也不清楚。很是自卑啊~~~后来自己理清了关系。大概就是这个样子:“让老师实现‘吃’这个功能。其中先让老师继承People这个抽象类,People类实现IPeople这个接口。
<span style="font-size:24px;">//作者:阿童木子using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace 类关键字{    class Program    {        static void Main(string[] args)        {            Teacher teacher=new Teacher() ;            ITeacher itea = (ITeacher) teacher;           itea.Eat();           Console.ReadKey();           Master master = new Master();           master.Teach();        }    }    //枚举   // public enum sex { Male = "男", Famale = "女" }    public enum Sex { Male = '男', Female = '女' }        //结构体 StudentParams(params关键字表示类型一样,数量不详,是一个可变的方法参数)    public struct StudentParams    {        public int ID;        public string name;        public string grade;        public Sex   sex;        public string department;    }    //接口    interface IPeople    {        string  Name        {            set;            get;        }        short Age        {            set;            get;        }        Sex Sex        {            set;            get;        }        void Eat();     }    //Teacher接口    interface ITeacher:IPeople    {        void Teach();    }    //Student接口    interface IStudent:IPeople     {        void Study();    }    //抽象基类    abstract class People:IPeople    {        private string name;        private short age;        private Sex  sex;        public string Name        {            get            {                return name != null ? name : "zhoulitong";            }            set            {                if (value!="" )                {                    name = value;                }            }        }        public Sex Sex        {            get            {                return sex;            }            set            {                value = sex;            }        }        public short Age        {            get            {                return age > 0 ? age : (short)0;            }            set            {                if (value >=0)                {                    age  = value;                }            }        }        //虚方法        public virtual void Eat()        {            Console.WriteLine("People eat.");        }        //抽象基类虚方法        public abstract void Sleep();        //{        //    Console.WriteLine("People sleep.");        //}    }    class Teacher:People,ITeacher    {        //重写基类虚方法        public override void Eat()        {            Console.WriteLine("Teacher eat.");        }        //重写抽象基类虚方法        public override void Sleep()        {            Console.WriteLine("Teacher sleep.");            //throw new NotImplementedException();        }        public void Teach()        {            Console.WriteLine("Teacher teach.");        }    }    //定义一个密封类,防止派生;    sealed class Master : Teacher    {        protected void Manage()        {        }    }}</span>
   这个例子体现在UML图中大致是这个样子的。
                   

结语

   这次学习最大的收获就是:
1、当了解一种东西的时候,一定要弄清楚需求;
2、敲代码的时候分块敲;
3、结合自己学过的东西(比如这次可以结合UML图);
4、对于不懂的东西敢于实践。(实践出真知)

感谢您的宝贵时间~~~
0 1
原创粉丝点击