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

前言

   学了这么长时间的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、对于不懂的东西敢于实践。(实践出真知)

感谢您的宝贵时间~~~
posted @ 2015-11-22 09:28  小小小同  阅读(224)  评论(0编辑  收藏  举报