黑马程序员-------面向对象的封装、继承、多态一些学习笔记

来源:互联网 发布:c语言 new 编辑:程序博客网 时间:2024/06/06 03:07

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

 

  • 多态

LSP里氏替换原则、多态。(程序的可扩展性、灵活性)方法重写override。虚方法的原理:虚方法表。


子类继承父类的属性和方法,使创建子类变得很简单,实现了代码重用、以及多态。


用虚方法实现多态

 class Program
    {
        static void Main(string[] args)
        {
            //ctrl + k + d  代码对齐快捷键

            //开放封闭原则:对扩展开放,对修改关闭原则

            Chinese ch = new Chinese("张三");
            Japanese ja = new Japanese("松下井田");
            American am = new American("Tom");
            //由于多个子类对象,那么声明一个父类的对象就能将子类的
            //对象一一放进来存放。
            Person[] per = new Person[] { ch, ja, am };

         
            for (int i = 0; i < per.Length; i++)
            {

                //如果随着人的不断增加,那么这个代码就要一直往下写。很麻烦
                #region 旧代码
                //由于person类中没有Say方法。所以是点不出来的
                //per[i].

                //if (per[i] is Chinese)
                //{
                //    Chinese c = (Chinese)per[i];
                //    c.Say();
                //}
                //else if (per[i] is Japanese)
                //{
                //    Japanese j = (Japanese)per[i];
                //    j.Say();
                //}
                //else
                //{
                //    American a = (American)per[i];
                //    a.Say();
                //}
                #endregion

                //这样就只要一句话的代码就能搞定
                //这就体现了多态
                per[i].Say();

            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }

 


class Japanese:Person
    {
        public Japanese(string name)
            : base(name)
        {

        }
        public override void Say()
        {
            Console.WriteLine("我叫{0},我是日本人!", Name);
        }
    }


class Chinese : Person
    {
        public Chinese(string name):base(name)
        {
            this.Name = name;
        }
        //如果子类要重写父类的方法,那么要在子类方法名前 加一个override关键字,如下
        //并且有且仅有这个一个关键字重写父类的方法

        public override void Say()
        {
            Console.WriteLine("我叫{0},我是中国人!",Name);
        }
    }

 

 class American : Person
    {
        public American(string name):base(name)
        {
            this.Name = name;
        }
        public override void Say()
        {
            Console.WriteLine("我叫{0},我是美国人!", Name);
        }
    }

 

 public class Person
    {
        public Person(string name)
        {
            this.Name = name;
        }

        public string Name
        {
            get;
            set;
        }
        //virtual关键字是标记为虚方法用的
        //如果一个方法是虚方法,那么这个方法在子类中就可以被重写了
        //子类继承父类后,可以直接使用父类的方法,也可以将它重写 (用关键字override即可)
        public virtual void Say()
        {
            Console.WriteLine("父类中的Say方法");
        }
    }

 

  • 封装

1、属性封装了字段

2、方法的多个参数封装成了一个对象

3、将一堆的代码封装到了一个方法中

4、将一些功能封装到几个类中

5、将一些具有相同功能的代码封装到了一个程序集中(dll、exe)
并且对提供统一的访问接口(属性名,方法名等)

  • 继承

1、继承  是类与类之间的关系

2、比如奔驰汽车(类)继承了汽车(类)

3、继承的优点:
 代码重用

 

继承的特点:
继承具有单根性。即只能继承一个父类,不能继承多个父类

继承具有传递性。当类A继承自object类的时候,
这时A类就有了object类中继承下来的的4个方法:
Tostring(),GetType(),GetHashCode(),Equals()
然后类B又继承了类A,那么类B会将类A中的四个方法继承下来
由于那4个方法是在object中的,所以相当于类B间接从object中继承下来了成员

 

C#中任何一个类都是继承自object类的,如果一个类没有继承自任何类,
则默认继承自object类。如果显示的指定了当前类继承自某个类,则将覆盖默认继承的object类


 

 

------- Windows Phone 7手机开发.Net培训、期待与您交流! -------

 

原创粉丝点击