关于面向对象编程

图片 14

简介

                                                                       
                                                                       
              2017年3月21日  于青岛软件园  夜 21:42

继承(封装、多态)是面向对象编程三大特性之一,继承的思想就是摈弃代码的冗余,实现更好的重用性。

     
 以前看过一个节目,其中有一个情节:一个小女孩对几本文言文书籍熟读能背像《三字经》,《诗经》,《笠翁对韵》。主持人吃惊的她的妈妈,这么小让她接触文言文,小孩子不会觉得难而反感,为什么现在还兴致勃勃。他妈妈的答案里有一句话至今让我记忆犹新:“…小孩子的世界里没有难易概念的…”

继承从字面上理解,无外乎让人想到某人继承某人的某些东西,一个给一个拿。这个语义在生活中,就像

       
是啊,一片白纸,你上什么颜色,它就接受什么颜色。它没有什么去对比。就如我们一般,没有接触过机器语言,汇编语言,甚至C语言,直接就是C#。所有我们大多数人没有对C#关于直接面向对象思想方法出来而感到神奇的觉悟。(后续待更)

家族继承财产,爷爷将财产继承给儿女,儿女在将财产继承给子孙,有些东西可以继承有些的东西只继承给


某人。映射到编程当中,其思想也大致如此。

(整理笔记)


面向对象编程:

 通过示例引出继承的作用

1.构造方法:

Man类后面的“()”,其实就是构造方法。只要你想创建类或结构的实例,必须调用它的构造方法,构造方法负责对类里面的字段进行初始化。(初始化
int 类型为0,bool类型为 false,char,string类型为“空”….)

图片 1

定义:构造方法必须类重名; 构造方法没有返回值,但可以有参数;

图片 2

构造方法可以有多个重载;  不带参数的构造方法为默认构造;

小结: 构造方法的本质是一个构造器,是为了类的实例化而产生;

           
构造方法是一种特殊的方法,它没有返回值,它必须与类重名,它只能在初始化的时候
            被系统自动执行,外部不能调用;

          如果将构造函数设置为private,则不能被外部实例化;

         
如果类里面有带参数的构造方法,想调默认构造时,必须把默认构造显示写出来;

遇到小问题:

图片 3

答案如下: 可以

图片 4

在代码中定义个三个类:Cat猫、Dog狗、Cattle牛。

2.析构方法:

析构方法:
析构方法用于析构类的实例,构造方法用于实例化,分配内存空间,而析构方法正
                     好与它相反,用于释放内存空间

图片 5

图片 6

小结:不能再结构中定义析构方法,只能对类使用析构方法;

            一个类只能有一个析构方法;

           无法继承或重载析构方法;

            它们是被自动调用的;

           析构方法既没有修饰符,也没有参数;

图片 7

3.面向对象程序设计:

           
面向过程:分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用
                               的时候一个一个一次调用就可以了。

           
 面向对象:把构成事物分解成各个对象,创建对象后用对象调用各自方法以达到解决问
                               题的目的

           特性:封装,继承,多态,(密封);

         
 OOP(面向对象编程)达到软件工程的三个目标:重用性,灵活性,扩展性;

从类图上可以看出红色标识区域,三个类的定义出现了大量的冗余(字段、属性、方法),那么在编写代码时就会出现大量的重复代码。

4.面向对象的特性:

封装:是实现面向对象程序设计的第一步,封装就是将数据或者函数等集合在一个个的单元中
            (我们称之为类)

           
意义,在于保护或者防止代码(数据)被我们无意中破坏,在于高效的调动各个对象资
            源;

            就是对类成员的再次包装,这样写更规范:
 Get方法,Set方法对字段的封装,属性对               字段的封装

图片 8

继承:继承用于创建可重用,扩展和修改在其他类中定义的行为的新类。其成员被继承的类称
           
为“基类”,继承这些成员的类称为“派生类”。派生类只能有一个直接基类。但是,继承是
           
可以传递的。如果ClassB派生出ClassC,ClassA派生出ClassB,则ClassC会继承  
                  ClassB和ClassA中的成员;

通过在派生类名后面追加冒号和基类名称,可以指定基类

图片 9

在创建子类的时候,必须要调用父类的构造方法,调用方式有两种:1,隐式调用2,显示调用
          (base)    隐式调用用了父类的无参构造器

图片 10

(后续)

试想一下,随着业务功能的扩展,可能会出现更多类,那么冗余(重复的代码)会更多。比如出现同样会造成冗余的类:

Pig猪、Panda熊猫、Sheep羊……等等。这些类同样会有相同的特征:名称、性别、年龄、奔跑(字段、属性、方法)。


 如何解决此类冗余问题 ——
使用继承

继承的思想:

当我们定义了多个类,这多个类都存在重复的成员(共性)。我们可以将这些重复的成员单独的提取封装到一个类中,作为这些具有相同特征类的父类。

将此思想作用于上述的三个类

提取共性:可以直观看出重复的具有共性的项目有:1.字段和属性(年龄、姓名、性别)、2.方法(奔跑)。

封装到一个类:如何定义这个类?Cat猫、Dog狗、Cattle牛有明显共同的特性,就是他们都是动物,故可以抽象定义一个Animal动物类。

图片 11

 

如何在代码中实现继承

图片 12

    class Animal
    {
        private string name;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }

        private string gender;
        public string Gender
        {
            get { return gender; }
            set { gender = value; }
        }

        private int age;
        public int Age
        {
            get { return age; }
            set { age = value; }
        }

        public void Run()
        {
            Console.WriteLine("奔跑。。。");
        }

    }

    class Cat:Animal
    {   
        public void CatchMouse()
        {
            Console.WriteLine("抓老鼠。。。");
        }
    }

    class Dog:Animal
    {
        public void GuardHouse()
        {
            Console.WriteLine("看家护院。。。");
        }
    }

    class Cattle:Animal
    {
        public void Plowland()
        {
            Console.WriteLine("耕田。。。");
        }
    }

通过一个简单的  :(冒号)实现了继承关系。

实现继承后产生了两个角色:1.子类(派生类)、2.父类(基类)

代码中子类删除父类提取的重复性成员。

 

实现继承后的关系如下图:

图片 13

实现继承后每个子类仅保留了自己特有的特性,大大减少了冗余。

 

继承后的能力

子类的共性成员都被父类提取了,那么子类要使用怎么办?

子类继承父类后,将会隐式继承父类的所有成员,但不包括构造函数。

在继承后,访问其父类成员,会受到访问修饰符的限制。故,修饰为private的私有成员不会访问到。

 

继承的特性

1.继承的单根性:

  一个子类只能有一个父类,就好比一个人只有一个父亲。

2.继承的传递性:  

   例如, ClassC 派生自 ClassB,并且 ClassB 派生自 ClassA,则 ClassC
会继承在 ClassB 和 ClassA 中声明的成员。

依次顺序可以不断向上取。

图例:

图片 14


 继承被后的秘密 ——
子类和父类的构造函数(难点)

给父类编写了一个构造函数,示例代码如下:

发表评论

电子邮件地址不会被公开。 必填项已用*标注