设计模式——面向对象基础(封装、继承、多态)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lrtcsdn/article/details/82528006

今天要学习面向对象的三大特性:封装、继承、多态
刚看到这三个词的时候,封装:把东西打包好,包装起来就好了;继承:就像是遗传差不多吧,哈哈;多态:一个人的形象是多种多样的。
说了半天都是我自己的想象,那么在计算机中什么意思呢?一个一个来说一说!

【封装】
定义:每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏

举个栗子:我们的房子就是一个类的实例,室内的装修摆设只能被室内的居住者欣赏与使用,没有四面的墙壁,室内的活动就一览无余了。这四面的墙壁就是封装了。我们可以看到我们屋子四面墙壁上都有门窗,这些门窗就是封装对象暴露在外的属性和方法,专门供人进出,让屋子充满阳光。

在前边设计模式——面向对象基础(类、对象)中说到小猫的叫,那么我们想添加一个小狗叫,就很简单了,直接模仿一下Cat类就可以了。

        private int shoutNum = 3;
        public int ShoutNum//再声明一个属性,不用加;
        { 
           get 
            {
                return shoutNum;
            }
            set
            {
                shoutNum=value;
            }
        }
        private string name = "";//name是一个字段,私有的类变量
        public Dog(string name)
        {
            this.name = name;
        }


        public string Shout()
        {

            return"我的名字叫"+name+ "汪汪汪";
        }

客户端代码

 private void button2_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog("旺财");
            dog.ShoutNum = 5;
            MessageBox.Show(dog.Shout());
        }

由此我们可以看出封装的优缺点
封装的好处
.1.良好的封装能够减少耦合
2.类内部的实现可以自由地修改
3.类具有清晰的外接口
封装的缺点:有大量重复的代码

【继承】
在封装中有大量重复的代码,这时候我么就可以用到继承了。
继承的意思,和我理解的汉语意思有些类似,就像儿子继承了父亲的特性!
那在编程上呢?对象的继承代表一种”is-a”的关系,如果两个对象A和B,可以描述为”B是A”,表明B可以继承A。就像是儿子继承类父亲的特性,儿子(继承者)除了具备父亲(被继承者)的特性外,还具备自己独有的个性!
继承定义了类如何关联,共享特性,继承的工作方式是,定义父类和子类,或叫做基类和派生类。

子类继承父类,
第一:子类拥有父类非private的属性和功能;
第二:子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;
第三:子类还可以以自己的方式实现父类的功能(方法重写);
注意:在C#中,子类从它的父类中继承的成员有方法、域、属性、事件
索引指示器,但对于构造方法,有一些特殊,他不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。

继承的优点:
1.子类的公共代码发在父类上,代码共享,避免重复
2.继承使修改或扩展继承而来的实现比较容易
继承的缺点:
1.父类变,子类不得不变。
2.继承会破环包装,父类实现细节暴露给子类,增大了两个类之间的耦合性;继继承的特性:
继承是一种类与类之间强耦合的关系

【多态】
多态(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

原理:当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。(虚方法是按照其运行时类型而非编译时类型进行动态绑定调用的。)

注意:
第一:子类以父类身份出现。
第二:子类在工作时以自己的方式来实现。
第三:子类以父类的身份出现,子类特有的属性和方法不可以使用。

面向对象的继承和多态很相连,所以代码一起呈现了
建立父类Animal

 class Animal
    {
           protected string name = "";//修饰符改为pritected,继承
           public virtual string Shout()//添加修饰符virtual,表示此方法是虚方法,可以被子类重写,多态
           { 
               return"";
           }
           public Animal (String name)
           {
               this .name =name ;
           }
           public Animal()
           {
               this.name = "待我想想叫什么";
           }
           protected int shoutNum = 3;
           public int ShoutNum
           {
               get
               {
                   return shoutNum;
               }
               set
               {
                   ShoutNum = value;
               }
           }
    }

子类:这里就说一个类

    class Cat:Animal //继承格式:父类:子类,继承
    {
        public Cat ():base()//base关键字代表父类
        {
        }

        public Cat(string name) : base(name)
        { }

        public override string Shout()//增加override,表示方法重写
        {
            string result = "";
            for (int i = 0; i < shoutNum; i++) result += "喵,";

            return "我的名字叫" + name + "" + result;
        }

多态的客户端代码


    public partial class Form1 : Form
    {
        private Animal[] arrayAnimal;//声明一个动物数组
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Cat cat = new Cat("咪咪");
            MessageBox.Show(Shout());
        }
        string Shout()
        {
            return "喵";
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Dog dog = new Dog("旺财");
            dog.ShoutNum = 5;
            MessageBox.Show(dog.Shout());
        }

        private void button3_Click(object sender, EventArgs e)//报名按钮
        {
            arrayAnimal = new Animal[5];//有五个动物可以报名,猫狗猫猫狗
            arrayAnimal[0] = new Cat("小白");
            arrayAnimal[1] = new Dog ("小黑");
            arrayAnimal[2] = new Cat("花花");
            arrayAnimal[3] = new Cat("咪咪");
            arrayAnimal[4] = new Dog("大黄");

        }

        private void button4_Click(object sender, EventArgs e)
        {
            foreach (Animal item in arrayAnimal)//遍历这个数组让他们都Shout
            {
                MessageBox.Show(item.Shout());//由于有了多态性,虚方法,叫的时候程序自动找item是什么对象,然后用对应的方法重写

            }
        }

    }

总结:封装、继承、多态是把程序的耦合度降低
耦合性(英语:Coupling,dependency,或称耦合力或耦合度)是一种软件度量,是指一程序中,模块及模块之间信息或参数依赖的程度。

猜你喜欢

转载自blog.csdn.net/lrtcsdn/article/details/82528006