zoukankan      html  css  js  c++  java
  • 《大话设计模式》 基础篇 学习笔记

     

    《大话设计模式》  学习笔记

     

    一、培训实习生

    关于类与对象

    万物皆对象,对象是一个自包含的实体,用一组可识别的特性和行为来标识;

    类就是具有相同属性和功能的对象的抽象集合。

     

    为什么类要实例化

    实例是为了产生的一个真实的对象,实例化就是创建对象的过程

     

    构造方法

    构造方法,又叫构造函数,其实就是对类进行初始化。构造方法与类同名,无返回值,也不需要void,在new 的时候调用。

    所有的类都有构造方法,如果你不编码则系统默认生成空的构造方法,如果你有定义的构造方法,那么默认的构造方法就会失效。

     

    方法重载

    方法重载提供了创建同名的多个方法的能力,但这些方法需使用不同的参数类型或个数。

     

    属性

    属性是一个方法或一对方法,但在调用它的代码看来,这是一个字段,即属性适合于以字段的方式使用方法调用的场合。

     

    封装

    每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装,因此对象不必依赖其他对象来完成自己的操作。

    封装的好处:

    1、良好的封装能够减少耦合

    2、类内部的实现可以自由修改

    3、类具有清晰的对外接口

     

    继承 

    继承定义了类如何相互关联,共享特性。继承的工作方式是,定义父类和子类,或叫做基类和派生类,其中子类继承父类的所有特性。子类不但继承了父类的所有特性,还可以定义新的特性。

    如果子类继承于父类,

    第一、子类拥有父类非private的属性和功能;

    第二、子类具有自己的属性和功能,即子类可以扩展父类没有的属性和功能;

    第三、子类还可以以自己的方式实现父类的功能(方法的重写)

    对于构造方法,它不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。

     

    多态

    多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。

    为了使子类的实例完全接替来自父类的类成员,父类必须将该成员声明为虚拟的。这是通过在该成员的返回类型之前添加vittual关键字来实现;

    子类可以选择使用override关键字,将父类实现替换为它自己的实现,这就是方法重写override,或者叫做方法复写

    多态的原理是当方法被调用时,无论对象是否被转换为其父类,都只有位于对象继承链最末端的方法实现会被调用。

     

    抽象类

    抽象类拥有尽可能多的共同代码,拥有尽可能少的数据

    抽象类通常代表一个抽象概念,它提供一个继承的出发点,当设计一个新的抽象类时,一定是用来继承的,所以,在一个以继承关系形成的等级结构里面,树叶节点应当是具体类,而树枝节点均应当是抽象类。

    第一,抽象类不能实例化

    第二,抽象方法是必须被子类重写的方法

    第三,如果类中包含抽象方法,那么类就是必须定义为抽象类,不论是否还包含其他一般方法。

     

    接口

    接口是把隐式公共方法和属性组合起来,以封装特定功能一个集合。一量类实现了接口,类就可以支持接口所指定的所有属性和成员。声明接口在语法上与声明抽象类完全相同。

    实现接口的类必须要实现接口中的所有方法和属性。

    一个类可以支持多个接口,多个类也可以支持的接口。

    接口用interface声明,而不是class,接口名称前要加'I',接口中的方法 或属性前面不能修饰符、方法没有方法体。

    interface Ichange

    {

       string ChangThing(string thing);

    }

     

    接口与抽象类的区别:

    抽象类可以给出一些成员的实现,接口却不包含成员的实现,抽象类的抽象成员可被子类部分实现,接口的成员需要实现类完全实现,一个类只能继承一个抽象类,但可实现多个接口。

    第一、类是对对象的抽象;抽象类是对类的抽象;接口是对行为的抽象。

    第二、如果行为跨越不同类的对象,可使用接口;对于一些相似的类对象,用继承抽象类。

    第三、从设计角度讲,抽象类是从子类中发现了公共的东西,泛化出父类,然后子类继承父类,而接口是根本不知子类的存在 ,方法如何实现还不确认,预先定义。

     

    模拟动物会

    猫,猴,猪,狗  都是动物,都有名字的字段,都有会叫的方法,所以我定义一个动物的父类,用来实现对名字字段的读取与设置(读名字与取名字,用属性来限制取名字的范围)。

    猫会喵喵叫,狗会汪汪叫,用多态实现不同的叫法。 Vrittual overrade

    可以实例化出一个有名字的猫,也可以实例化出一个有名字和年龄的猫,构造方法。

    由于动物类是一个抽象的类,不能被实例化,所以它应该是一个抽象类 obstract 

    如果猫里有叮当猫,猴子里有孙悟空,猪里有猪八戒, 它们都有变东西的能力(行为),而父类不能提供该方法,也不能是子类每一个都写这样的方法,所以只能用接口的方式来实现 interface

     

    来总结出一个UML类图:

     

     

    具体代码的实现:

    动物类:

    namespace 设计模式复习

    {

        //动物类是一个抽象类,不能被实例化,用关键字abstract修饰

      abstract  class Animal

        {

          //父类成员要被子类成员访问,用protected修饰

            protected string _name;

            private int shoutnum=3;

            //要限定叫的次数,叫的次数不能被其它类访问,字段就用private修饰

            //用属性的方式来控制叫的次数的赋值

            protected int Shoutnum

            {

                get { return shoutnum; }

                set

                {

                    if (shoutnum < 4)

                    {

                        shoutnum = value;

                    }

                    else

                    {

                        shoutnum = 3;

                    }

                }

            }

          //构建具有不同参数的构造函数

            public Animal()

            {

                this._name = "无名";

            }

            public Animal(string name)

            {

                this._name = name;

            }

           //抽象方法前加abstract,抽象方法没有方法体,方法体要被子类'赋值'

            public abstract string Shout();

        }

    }

     

    猫类:

    namespace 设计模式复习

    {

        class Cat:Animal

        {

            //对于构造方法,它不能被继承,只能被调用。对于调用父类的成员,可以用base关键字。

            public Cat(string name):base(name)

            {}

            public Cat():base()

            {}

            //override可以对抽象类的抽象方法进行'赋值',代替了对虚方法的重写(virtual)

            public override string Shout()

            {

                return this._name +Shoutnum+ "~";

            }

        }

    }

     

    狗类:

    namespace 设计模式复习

    {

        class Dog:Animal

        {

            public Dog():base()

            {

            }

            public Dog(string name):base(name)

            {  

            }

            public override string Shout()

            {

                return this._name + Shoutnum + "汪汪";

            }

        }

    }

     

    接口的实现:

    定义接口:

    namespace 设计模式复习

    {

        interface IChange

        {

            string ChangeThing(string thing); //声明一个IChange接口,此接口有一个ChangeTing

                                     //方法,参数是一个字符串变量,返回一个字符串

        }

    }

     

    调用接口:

    namespace 设计模式复习

    {

        //机器猫继承自猫类,并实现IChange接口,注意用,分隔

        class MachineCat : Cat, IChange

        {

            public MachineCat()

                : base()

            { }

            public MachineCat(string name)

                : base(name)

            { }

            //实现接口的方法,注意不能加override修饰符, base.Shout()表示调用父类Cat的方法

            public string ChangeThing(string thing)

            {

                return base.Shout() + "我有万能的口袋,可以变出:" + thing;

            }

        }

    }

     

    功能实现:

      //由于dog1Shout()抽象方法是override父类的抽象方法,就得用父类接收,其实就是调用父类的方法

         Animal dog1 = new Dog("旺财");

         MessageBox.Show(dog1.Shout());

    接口的实现:

       MachineCat mcat = new MachineCat("叮当");

        string res = mcat.ChangeThing("名种名样的东西");

     

  • 相关阅读:
    容器跨主机网络通信学习笔记(以Flannel为例)
    Kubernetes控制器Job和CronJob
    记一次使用Flannel插件排错历程
    Kubernetes控制器Deployment
    Kubernetes如何通过StatefulSet支持有状态应用?
    react18 来了,我 get 到...
    gojs 实用高级用法
    vuecli3 vue2 保留 webpack 支持 vite 成功实践
    calibre 报错 This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem. 解决
    unable to recognize "*.yaml": no matches for kind "RoleBinding" in version "rbac.authorization.k8s.io/v1beta1"
  • 原文地址:https://www.cnblogs.com/inline/p/2486779.html
Copyright © 2011-2022 走看看