面向对象之多态

来源:互联网 发布:赌场掷骰子庄家算法 编辑:程序博客网 时间:2024/05/02 11:58

     多态是面向对象的三大特性之一,另外两大特性是封装,继承。多态对于初学者来说很难接受,不过我们可以望文生义一下,所谓多态就是好多种状态,不错就是多种状态。这是从何说起呢,就拿一个简单的例子来说吧,比如:公鸡和母鸡,无论是什么鸡总之一句话都是鸡,鸡这时候就可以说成一种事物相当于我们程序里的类,不同的状态就是公母之分,也就是鸡有两种类型,在这里先以两种状态论之,但是这两种鸡都是鸡,它们之间有太多的不同点如母鸡会下蛋,公鸡不会,公鸡会叫晓,母鸡会咯咯哒的叫。从此我们就可以得出一句话多态是不同子类对同一个消息作出不同的反映 ,同样是鸡但是叫声却是不一样的。

           鸡是父类,公鸡和母鸡是其两个子类,对同一个叫的方法却声音不一样。
           说了半天多态到底有什么好处呢?有什么用处呢,先听一例:我们大部分都是在给别人打工,你所在的公司不会是就你一个人,也不会就你所在的一个部门。早上9点上班了,老板不会每个部门都说一遍技术部干技术工作了,销售部开始销售了,研发部开始研发了,运维部开始运维了,如果天天是这样老板也是没救了,呵呵,老板顶多9点说一句大家开始工作了,每个部门开始做自己得事情,销售不会去做技术的工作。这就是一个现实中的多态的应用,再到程序也是一样的,每个子类有相同的方法,但是方法内容却是不一样的,这是通过多态来实现的,例如:
1.父类Person
       public enum Genders
    {
        Male, Female
    }
    abstract public class Person
    {
        public Person() { }
        public Person(string name, int age, Genders gender)
        {
            this.Name = name;
            this.Age = age;
            this.Gender = gender;
        }
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }
        private int age;
        public int Age
        {
            get { return age; }
            set
            {
                //属性是聪明的字段
                if (value > 0 && value < 100)
                {
                    age = value;
                }
                else
                {
                    age = 18;
                }
            }
        }
        //请回答:为什么我们能看到 Genders 枚举?
        private Genders gender;
        public Genders Gender
        {
            get { return gender; }
            set { gender = value; }
        }
        public abstract void SayHi();
    }
2.student子类
class Student:Person
    {
        public Student(){ }   
        public Student(string name, Genders gender, int age, string hobby, int popularity)
            : base(name, age, gender)
        {
            //学生类扩展的属性
            this.Hobby = hobby;
            this.Popularity = popularity;
        }
        //人气指数
        private int popularity;
        public int Popularity
        {
            get { return popularity; }
            set { popularity = value; }
        }
        /// <summary>
        /// 爱好
        /// </summary>
        private string hobby;
        public string Hobby
        {
            get { return hobby; }
            set { hobby = value; }
        }
        override public void SayHi()
        {
            string message = string.Format(
                "大家好,我是 {0} 同学,今年 {1} 岁了,我喜欢 {2}!",
                base.Name, base.Age, this.hobby
            );
            MessageBox.Show(message);
        }
    }
3.Teacher子类
 public class Teacher:Person
    {
        public Teacher(){ }
        public Teacher(string name, int age, Genders gender, int yearsOfService, int salary)
            : base(name, age, gender)
        {
            //教师类扩展的属性
            this.yearsOfService = yearsOfService;
            this.salary = salary;
        }
        private int salary;
        public int Salary
        {
            get { return salary; }
            set { salary = value; }
        }
        private int yearsOfService;
        public int YearsOfService
        {
            get { return yearsOfService; }
            set { yearsOfService = value; }
        }
        override public void SayHi()
        {
            string message;
            message = string.Format(
               "大家好,我是 {0} 老师。我今年 {1} 岁了。工作 {2} 年了!",
               this.Name, this.Age, this.yearsOfService
           );
           MessageBox.Show(message);
        }
    }
这样调用不同类的SayHi方法就会说出不同的内容,这就是程序中多态的一种完美体现。
最后在提示一下:
     1、多态是通过抽象类抽象方法实现的
     2、类内部方法的重载也是多态的一种表现

原创粉丝点击