zoukankan      html  css  js  c++  java
  • 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、对于不懂的东西敢于实践。(实践出真知)

    感谢您的宝贵时间~~~
  • 相关阅读:
    Python之遍历所有行
    Python之找到所有空值所在行
    Python之根据条件筛选特定行
    Python之ArcGIS的字段计算器的运用
    Python之时间格式的快速处理
    Python之多列数据(元组)同时写入DataFrame不同列
    Python之对DataFrame的多列数据运用apply函数操作
    ubuntu12 配置samba服务 实现文件共享 分类: ubuntu 测试 虚拟机 2015-04-25 20:35 38人阅读 评论(0) 收藏
    判断一个对象是否可迭代 的方法 分类: python 2015-03-27 12:20 82人阅读 评论(0) 收藏
    ubuntu中设置tomcat自启动 分类: ubuntu 测试 2015-02-28 17:15 66人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/zhoulitong/p/6412447.html
Copyright © 2011-2022 走看看