• 面向对象三大特征



           近期刚開始学习设计模式。在学习初期,把面向对象这个概念弄明确是非常有必要的。

           之前接触过C语言的基础,后来又学了一点VB,只是这都不是面向对象的语言,当然在编程中也就无法体会到面向对象的思想。

           近期接触了软件project、UML之后才渐渐了解了面向对象的概念,继而又简单学习了一下C++、C#,以下以C#为工具来总结一下眼下所认识的面向对象     


             何为对象?

        进入正题之前,我们先来探讨一下什么是“对象”,不要误会,此“对象”非彼“对象”→_→。

        举个样例。一仅仅小狗。它有眼睛、嘴巴、鼻子、颜色等静态特征(属性),也有吃东西、睡觉等动态特征(方法)。又比方一个手机,它既有型号、大小等静态特征(属性),也有打电话、发短息等动态特征(方法)。所以,对对象简单的定义就是“对象是一个包括属性和方法的总体”


        面向对象编程(OOP)

           早期的计算机编程是基于面向过程的方法,比如实现一个求圆的面积的功能:S=3.14*r*r。通过设计一个算法就能够解决这个问题。随着需求的不断提高,须要被解决的问题也变得越来越复杂,比如前段时间比較火的“捕鱼”游戏,在游戏中,有成千上万条鱼、无数子弹。还有渔网、海底装饰物等等,但在制作游戏的过程中。我们的编程人员不能依据每条鱼的外形。游动方式而写一段对应的代码吧,那还不累死……所以用面向过程的方法来解决就有些困难了。这时就要用到面向对象。

        一切事物皆对象,我们能够将现实世界中的不论什么事物看成是对象,比方在“捕鱼”游戏的实现中,每条鱼就是一个对象,每张网是一个对象……可是为了避免枯燥乏味,不能仅仅要一条鱼。一张网吧,所以。就要把全部的鱼的共同点找出来。抽象出一个“鱼类”。把全部网的共同点找出来,抽象出一个“网类”……然后用的时候就能够让个鱼类实例化出无数条鱼。

    所以说,面向对象攻克了传统的面向过程的编程方法所无法解决的代码复用的问题。


          


       面向对象的特征

                面向对象有三大特征:封装、继承和多态。

           封装

           封装就是把客观的事物抽象成类,而且类把自己不想对外开放的成员“藏起来”,只提供一些对应的接口供外界訪问,实现了信息隐藏。提高了安全性。如一个钟表类,有时、分、秒等属性,有调整时间等方法,实现封装的代码为:       

     class Clock
        {
            private int hour, minute, second;
            public int Hour
            {
                get { return Hour; }
                set { Hour = value; }
            }
            public int Minute
            {
                get { return Minute; }
                set { Minute = value; }
            }
            public int Second
            {
                get { return Second; }
                set { Second = value; }
            }
        }

           在代码中,hour、minute、second就是Clock类“藏起来”的属性。Hour、Minute和Second就相当于是外界訪问Clock这些私有属性的接口。


            继承

            假如在整个捕鱼游戏中,有成千上万条鱼。尽管有很多种类的鱼,但这些鱼会有很多共同点。比方每条鱼在屏幕上都会有一个位置(x坐标和y坐标),都会向前游动等等。这时候就能够依据全部鱼的共同特征,抽象出来一个“鱼”类,这个“鱼”类中包括了全部鱼的共同点。因此在实例化每种鱼的时候都使得公用代码得到了共享,避免了反复。  

    class Fish
        {
            protected double x;
            protected double y;
            public Fish()
            {
                x = 0;
                y = 0;
            }
            public double X
            {
                get { return x; }
                set { x = value; }
            }
            public double Y
            {
                get { return y; }
                set { y = value; }
            }
            public void Swim(double distance_x, double distance_y)
            {
                x += distance_x;
                y += distance_y;
            }
        }
        class Turtle : Fish
        {
            public Turtle() : base() { }
            public void Turn()
            {
                //为了差别于其它的鱼,就给乌龟加一个转头并按原路返回的方法
                //……相关代码……
                //……………………
                //……………………
                //……相关代码……
            }
        }
        class Mermaid : Fish
        {
            public Mermaid() : base() { }
            public void SwingArms()
            {
                //为了差别于其它的鱼,就给美人鱼加一个摇摆双臂的方法
                //……相关代码……
                //……………………
                //……………………
                //……相关代码……
            }
        }
           这时,Fish类就是父类(基类)。Turtle类和Mermaid类就是子类(派生类)。


           多态

           多态就是用不同的对象调用调用相同的方法,运行不同的操作。

    还是用捕鱼游戏来举样例,假定美人鱼仅仅能一直向前游。而乌龟能够向随意方向(游动的时候x坐标和y坐标都能够发生改变),则每种鱼就不能仅仅是单单继承Fish的Swim方法了,应该让特定的鱼种继承了Swim方法之后能够有不同游法(尽管相同是游泳,但各有各游的方式。就如同小猫叫的时候是“喵”,小狗叫的时候是“汪”)。    

           实现方法便是在父类中

    class Fish
        {
            protected double x;
            protected double y;
            public Fish()
            {
                x = 0;
                y = 0;
            }
            public double X
            {
                get { return x; }
                set { x = value; }
            }
            public double Y
            {
                get { return y; }
                set { y = value; }
            }
            public virtual void Swim(double distance_x, double distance_y)
            {
            }
        }
        class Turtle : Fish
        {
            public Turtle() : base() { }
            public void Turn()
            {
                //为了差别于其它的鱼。就给乌龟加一个转头并按原路返回的方法
                //……相关代码……
                //……………………
                //……………………
                //……相关代码……
            }
            public override void Swim(double distance_x, double distance_y)
            {
                x += distance_x;
                y += distance_y;
            }
        }
        class Mermaid : Fish
        {
            public Mermaid() : base() { }
            public void SwingArms()
            {
                //为了差别于其它的鱼。就给美人鱼加一个摇摆双臂的方法
                //……相关代码……
                //……………………
                //……………………
                //……相关代码……
            }
            public override void Swim(double distance_x, double distance_y)
            {   
                //美人鱼游的时候仅仅是x坐标发生改变
                x += distance_x;
            }
        }

                 代码中,在Fish类中的Swim方法要变为虚方法(其函数体内能够为空),子类继承这个虚方法后进行重写(即依据自己的特点进行扩充或改变)。假设父类中的虚方法有形參,则子类中重写的时候,函数的形參列表要与父类中虚方法的形參列表一致。

      

            如有不足与纰漏,恳请您留下宝贵意见与建议,感激不尽。

  • 相关阅读:
    bzoj 4610 Ceiling Functi
    uva 01350
    uva 12075
    uva 01393
    uva 11038
    CF 496E
    CF 496D
    poj 3167
    hdu 4622
    spoj 7258
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/5161257.html
Copyright © 2020-2023  润新知