zoukankan      html  css  js  c++  java
  • 类的复习

    类的继承

      通过继承,我们可以定义一个新类,新类纳入一个已经声明的类并进行扩展.

     ■可以使用一个已经存在的类作为新类的基础,已经存在的类称为基类(base class),新类称为派生类(derived class).派生类的组成成员如下.

       □自己声明中的成员

       □基类的成员

     ■要声明一个派生类,需要在类名后加入基类规格说明,基类规格说明由冒号和后面跟着用作基类的类的名称.派生类被描述为直接继承自列出的基类.

     ■派生类被描述为扩展它的基类,因为它包含了基类的成员,加上在它自己的声明中的任何附加功能.

     ■派生类不能删除它所继承的任何成员.

     ■在c#中,所有的类都直接或间接的继承自object类.(当我们定义一个类的时候,如果没有写:继承一个类,那么这个类就继承了object类,这就是为什么C#的所有类都有Equal()方法的原因,因为Equal()方法是Object类的成员)

     ■c#中类都是单继承,不允许某个类同时继承两个及以上的类.可以这样理解,父类(基类)就是父亲,一个人只有一个父亲.一个父亲能有多个小孩,所以一个基类可以派生多个子类

    例如,下面展示了类和继承的例子:

    class Person//基类,或称为父类
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            private int age;
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
            private char gender;
            public char Gender
            {
                get { return gender; }
                set { gender = value; }
            }
        }
    class Student : Person//继承类Student
        {
            private int classId;
            public int ClassId
            {
                set { classId = value; }
                get { return classId; }
            }
            private string hobby;
            public string Hobby
            {
                set { hobby = value; }
                get { return hobby; }
            }
            public void SayHello()
            {
                Console.WriteLine("大家好,我是{0},我今年{1}岁了,我是{2}生,我是{3}班级的,我喜欢{4}", Name, Age, Gender, classId, hobby);//包含基类的成员,加自己的成员,除了基类的私有成员外,其余成员都能访问到
            }
        }
    class Teacher:Person//继承类,或称子类
        {
            private string course;
            public string Cource
            {
                set{course=value;}
                get{return course;}
            }
            private int yearsOfService;
            public int YearsOfService
            {
                set { yearsOfService = value; }
                get { return yearsOfService; }
            }
        
            public void SayHello()
            {
                Console.WriteLine("你好,我是{0},我今年{1}岁了,教书{2}年了,我是{3}老师",Name,Age,yearsOfService,course);
            }
        }
    class Program
        {
            static void Main(string[] args)
            {
                Teacher t = new Teacher();
                //初始化
                t.Name = "翟群";
                t.Age = 23;
                t.YearsOfService = 2;
                t.Cource = "c#";
                t.SayHello();
    
                Student s = new Student();
                //初始化
                s.Name = "何雄军";
                s.Age = 24;
                s.Gender = '';
                s.ClassId = 2;
                s.Hobby = "玩计算机";
                s.SayHello();
                Console.ReadKey();
            }
        }

     父类构造方法的调用顺序

    class Person//基类,或称为父类
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            private int age;
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
            private char gender;
            public char Gender
            {
                get { return gender; }
                set { gender = value; }
            }
            public Person()//会在子类构造方法之前执行
          {
                Console.WriteLine("我是父类");
            }
        }
    class Student : Person//继承类Student
        {
            private int classId;
            public int ClassId
            {
                set { classId = value; }
                get { return classId; }
            }
            private string hobby;
            public string Hobby
            {
                set { hobby = value; }
                get { return hobby; }
            }
            public void SayHello()
            {
                Console.WriteLine("大家好,我是{0},我今年{1}岁了,我是{2}生,我是{3}班级的,我喜欢{4}", Name, Age, Gender, classId, hobby);//包含基类的成员,加自己的成员,除了基类的私有成员外,其余成员都能访问到
            }
            public Student()//父类构造方法执行之后才执行
            {
                Console.WriteLine("我是子类Student");
            }
         
            }
    class Program
        {
            static void Main(string[] args)
            {
                Student s1 = new Student();
                //单步调试,发现,创建对象时,首先找到Student()无参构造函数,但暂不会执行Student()构造函数,而是找到父类Person()无参构造方法并执行,然后返回执行Student()构造函数
    
                Teacher t1 = new Teacher("翟群", 23, '', "c#", 1);
                t1.SayHello();
            }
        }

     以上例子调用的是无参数构造方法,下面的例子调用的是有参构造方法

     class Person//基类,或称为父类
        {
            private string name;
            public string Name
            {
                get { return name; }
                set { name = value; }
            }
            private int age;
            public int Age
            {
                get { return age; }
                set { age = value; }
            }
            private char gender;
            public char Gender
            {
                get { return gender; }
                set { gender = value; }
            }
            public Person()//建议只要自己声明了无参构造方法,务必再声明一个无参构造方法.系统默认会调用无参构造方法
            {
                Console.WriteLine("我是父类");
            }
            public Person(string name, int age, char gender)
            {
                this.Name = name;
                this.Age = age;
                this.Gender = gender;
            }
        }
      class Teacher:Person//继承类,或称子类
        {
            private string course;
            public string Cource
            {
                set{course=value;}
                get{return course;}
            }
            private int yearsOfService;
            public int YearsOfService
            {
                set { yearsOfService = value; }
                get { return yearsOfService; }
            }
        
            public void SayHello()
            {
                Console.WriteLine("你好,我是{0},我今年{1}岁了,教书{2}年了,我是{3}老师", Name, Age, yearsOfService, course);
            }
            public Teacher(string name,int age,char gender,string course,int yearsOfService):base( name, age, gender)//此处若没写base(name,age,gender)构造方法,便是默认调用Person的无参构造方法即base()
            {
                this.course = course;
                this.yearsOfService = yearsOfService;
            }
            public Teacher()//建议只要自己声明了无参构造方法,务必再声明一个无参构造方法.系统默认会调用无参构造方法
            {
    
            }
        }

    构造函数的调用图解过程:

    注:若在同时调用一个类中的两个重载构造方法,比如同时调用Person的构造方法Person()和person(string name,int age,char gender)构造方法,代码实现为:Person(string name,int age,char gender):this().这样调用Person(string name,int age,char gender)构造方法之前会先执行person()构造方法

  • 相关阅读:
    20155209林虹宇 Exp6 信息搜集与漏洞扫描
    20155209 Exp5 MSF基础应用
    20155209林虹宇Exp4 恶意代码分析
    20155209 林虹宇 Exp3 免杀原理与实践
    20155209 林虹宇Exp2 后门原理与实践
    20155209林虹宇逆向及Bof基础实验报告
    补做课上实践题目
    2017-2018-2 20155203《网络对抗技术》Exp9 :Web安全基础
    2017-2018-2 20155203《网络对抗技术》 Exp8:Web基础
    2017-2018-2 20155203《网络对抗技术》 Exp7:网络欺诈防范
  • 原文地址:https://www.cnblogs.com/tobecabbage/p/3459014.html
Copyright © 2011-2022 走看看