黑马程序员-我的入学笔记4-类的继承和多态

---------------------- <a href="http://edu.youkuaiyun.com"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.youkuaiyun.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

   想多学些类的基础,掌握好基础,也便于理解后面要学到的东西,学得多了,发现技术是在帮我们更好的编程,来实现功能,让编程更简单些,工作量更少些,当然刚接触到,真的是生疏,总是有BUG出现,下面是我总结了笔记,修改好了,将类的继承和多态合并到下面的代码中.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace 类的扩展关于封装继承多态
{
    //枚举定义了两个变量(性别和职业)
    public enum Sex
    {
        男, 女
    }
    public enum Profession
    {
        学生, 教师, 程序员
    }

    //结构定义了个信息,包括姓名,性别,年龄
    public struct PersonMessage
    {
        string name;
        Sex sex;
        int age;

        //封装了结构的字段
        public string Name
        {
            get { return name; }
            set { name = value; }
        }       
        public Sex Sex
        {
            get { return sex; }
            set { sex = value; }
        }
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        //通过构造方法传参
        public PersonMessage(string myName, Sex mySex, int myAge)
        {
            name = myName;
            sex = mySex;
            age = myAge;
        }
    }

  
    class 类的扩展
    {
        static void Main(string[] args)
        {
            //关于静态
            //   不用被new,就能调用的方法:static方法,static方法就是普通函数
            //   在static方法中只能调用static成员,
            //   但在非static方法中也可以调用static成员
            //   静态类;被static修饰,不能被new的类
            // 与访问修饰符分开来理解,两点都要注意
            // 结构的赋值,结构也需要new
            PersonMessage message = new PersonMessage("王华", Sex.男, 24);
            PersonMessage message1 = new PersonMessage("童童", Sex.女, 21);
            PersonMessage message2 = new PersonMessage("大静", Sex.女, 16);
          
            Person perPerson = new Person(message);//new了下Person类
            perPerson.sayHi();//调用它的方法
            Teacher terPerson = new Teacher(message1, Profession.教师);
            //子类可以调用父类的方法
            terPerson.sayHi();
            terPerson.TeacherSayHi();//当然也可以调用自己的方法
            Student stuPerson = new Student(message2, Profession.学生);
            //通过重写调用与父类名相同的方法
            stuPerson.sayHi();

            //调用下牵引
            NameClass names = new NameClass();
            //通过牵引找要的姓名,并赋给了name1
            string name1 = names[0];
            //names[0] = "王小虫";不能对只读的再进行赋值
            Console.WriteLine("牵引中第一位叫{0},第二位叫{1},第三位叫{2}",names[0],names[1],names[2]);
            Console.WriteLine("牵引重载后输出的牵引值是:"+names["王小","100分"]);
            
            //调用原来的ToSting()方法,去应用ToString()方法
            Console.WriteLine(names);
            
            //调用继承抽象类People类的Myself类中改写的方法
            MyselfL me = new MyselfL();
            me.sayHi();
            me.swimming();
            //调用改写的ToString()方法
            Console.WriteLine(me);

            Console.ReadKey();
        }
    }

    //在NameClass类中定义了个牵引 ,找到相应的姓名
    class NameClass
    {
        string oneName = "王小虎";
        string twoName = "王小龙";
        string threeName = "石黑豹";
        public string this[int index]//这的index还可以是其他类型,也可以多个参数
        {
            get//这里只用了get,变成只读的
            {
                if (index == 0)
                    return oneName;
                else if (index == 1)
                    return twoName;
                else if (index == 2)
                    return threeName;
                else
                    //关于抛异常不太了解,需要进一步了解
                    //throw new Exception("错误,找不到序列号");//这里有错误,不知道什么情况,没有执行?
                return null;

            }
        }
        public string this[string name,string x]//牵引也可以重载
        {
            get
            {
                return name + x;
            }
        }
    }

    //父类,人类
    class Person
    {
        PersonMessage message;

        public PersonMessage Message
        {
            get { return message; }
        }

        public Person(PersonMessage message)
        {
            this.message = message;
        }
        public virtual void sayHi()//virtual用来定义成虚方法
        {
            Console.Write("大家好!我叫{0},性别{1},今年{2},请多多关照!\n", Message.Name, Message.Sex, Message.Age);
        }
    }
    //继承人类的子类Teacher类
    class Teacher :Person//有Person类派生的Teacher子类
    {
        Profession person = Profession.教师;

        public Profession Person1
        {
            get { return person; }
            set { person = value; }
        }

        public Teacher(PersonMessage message,Profession person):base(message) 
        {
            this.person = person;
        }

        public void TeacherSayHi()//子类定义自己的方法
        {
            Console.WriteLine("我的职业是一名{0}.", person);//保护字段,字段只用在本类中
        }
    }
    //继承人类的子类Student类
    class Student : Person//有Person类派生的Student子类
    {
        Profession person = Profession.学生;

        public Profession Person1
        {
            get { return person; }
            set { person = value; }
        }

        public Student(PersonMessage message, Profession person)
            : base(message)
        {
            this.person = person;
        }
       
        //第一种方法重写父类方法
        //public new void sayHi()//方法名与父类相同,重写了父类的方法,用new隐藏了父类的方法
        //{
        //    Console.Write("大家好!我叫{0},性别{1},今年{2},请多多关照!", Message.name, Message.sex, Message.age);
        //    Console.WriteLine("我还是一名{0}.", person);
        //}
       
        //第二种方法重写父类方法
        public override void sayHi()//也可以通过override来修饰,实现对父类的重写,父类的方法必须通过virtual修饰成虚方法
        {
            Console.Write("大家好!我叫{0},性别{1},今年{2},请多多关照!", Message.Name, Message.Sex, Message.Age);
            Console.WriteLine("我还是一名{0}.", person);
        }
    }
 }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值