《你必须知道的.NET》读书笔记一:小OO有大智慧

此篇已收录至《你必须知道的.Net》读书笔记目录贴,点击访问该目录可以获取更多内容。

一、对象

   (1)出生:系统首先会在内存中分配一定的存储空间,然后初始化其附加成员,调用构造函数执行初始化,这样一个对象实体就完成了出生过程。

Person aPerson = new Person("小周" , 25);

  (2)旅程:在某种程度上就是外界通过方法与对象交互,从而达到改变对象状态信息的过程。这也和人的生存之道暗合。

aPerson.ChangeName("Edison Chou");

  (3)插曲:

    3.1 继承之访问修饰符

    • public:最高访问权限,公司的董事会具有最高的决策权与管理权;
    • protected:部门经理,具有对本部门的直接管辖权,面向对象中体现为子类继承纵向关系的访问约定;
    • internal:类似于公司的职能部门的职责,不管是否具有上下级关系,人力资源部都有管辖其他部门员工的能力;(面向对象中体现为同一程序集的访问权限,只要是隶属于同一程序集,对象即可访问其属性等,不管是否存在隶属关系;)
    • protected internal:副总经理,从横向到纵向都有管理权;
    • private:最低访问权,公司一般职员,管好自己即可;

    3.2 多态实现方式-->在不同的情况下实现了不同的操作,而把决定权交给系统自行处理

    • 接口实现多态
    • 抽象类实现多态

  (4)消亡:对象和人,有生必然也有死。

    在.NET的世界中,对象的生命周期由GC来控制:GC管理所有的托管堆对象,当内存回收执行时,GC检查托管堆中不再被使用的对象,并执行内存回收操作;不被应用程序使用的对象,指的是对象没有任何引用。

二、继承

  (1)继承的分类:实现继承与接口继承

  (2)继承的本质:面向对象中类与类之间的一种关系;继承的类称为子类、派生类;而被继承类称为父类、基类或超类;通过继承,使得子类具有父类的属性和方法,同时子类也可以通过加入新的属性和方法或修改父类的属性和方法建立新的类层次;

  (3)实现继承与接口继承的区别:

    • 抽象类适合于有族层概念的类间关系,而接口最适合为不同的类提供通用功能
    • 接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系
    • 接口多定义对象的行为;抽象类多定义对象的属性
    • 版本式的问题最好以抽象类来实现
    • 因为值类型是密封的,所以只能实现接口,而不能继承类

  (4)面向对象基本原则:多聚合,少继承;低耦合,高内聚;

    Adapter模式实例-->类的Adapter模式与对象的Adapter模式相比,对象的Adapter模式通过聚合而非继承的方式来实现对原有系统的扩展,松散耦合,较少的新类型。

    #region 类的Adapter模式
    interface ITweetable
    {
        void ToTweet();
    }

    public class ChickenAdapter : Chicken, ITweetable
    {
        public void ToTweet()
        {
            Console.WriteLine("Chicken crows.");
        }
    }

    #endregion

    #region 对象的Adapter模式
    public class BirdAdapter : ITweetable
    {
        private Bird _bird;

        public BirdAdapter(Bird bird)
        {
            _bird = bird;
        }

        public void ShowType()
        {
            _bird.ShowType();
        }

        public void ToTweet()
        {
            //为不同的子类实现不同的ToTweet行为
        }
    }
    #endregion

三、封装

  (1)封装的作用:

    • 隐藏系统实现的细节,保证系统的安全性和可靠性;
    • 提供稳定不变的对外接口,因此系统中相对稳定部分常被抽象为接口;
    • 封装保证了代码模块化,提高了软件的复用和功能分离;

  (2)结论:封装就是一个包装,将包装的内外分为两个空间,对内实现数据私有,对外实现方法调用,保证数据的完整性和安全性。

  /// <summary>
    /// 用户类
    /// </summary>
    public class Client
    {
        private string name;         //用户姓名

        public string Name
        {
            get { return name; }
            set
            {
                name = value == null ? String.Empty : value;
            }
        }

        //private string firstName;
        //private string secondName;

        //public string MyName
        //{
        //    get { return firstName + secondName; }
        //}

        private int age;                //用户年龄

        public int Age
        {
            get { return age; }
            set
            {
                if ((value > 0) && (value < 150))
                {
                    age = value;
                }
                else
                {
                    throw new ArgumentOutOfRangeException("年龄信息不正确。");
                }
            }
        }

        private string password;  //用户密码

        public string Password
        {
            get { return password; }
            set
            {
                if (value.Length < 6)
                    password = value;
            }
        }

        //public string get_Password()
        //{
        //    return password;
        //}

        //public string set_Password(string value)
        //{
        //    if (value.Length < 6)
        //        password = value;
        //}
    }

四、多态

  (1)定义:可以呈现不同形式的能力或状态;

  (2)分类:基类继承式多态接口实现式多态

  (3)运行机制:动态绑定(在运行期通过检查虚拟方法表来确定动态关联覆写的方法)

  (4)DEMO:多态版万能文件加载器(FileLoader)

   interface IFileOpen
    {
        void Open();
    }

    enum FileType
    {
        doc,
        pdf,
        txt,
        ppt,
        jpg,
        gif,
        mp3,
        avi
    }

    abstract class Files : IFileOpen
    {
        private FileType fileType = FileType.doc;

        public FileType FileType
        {
            get
            {
                return fileType;
            }
        }

        public abstract void Open();
    }

    abstract class DocFile : Files
    {
        public int GetPageCount()
        {
            //To do code
            return 0;
        }
    }

    abstract class ImageFile : Files
    {
        public void ZoomIn()
        {
            //放大比例
        }

        public void ZoomOut()
        {
            //缩小比例
        }
    }

    abstract class MediaFile : Files
    {
        public void Play()
        {
            //播放媒体
        }

        public void Pause()
        {
            //暂停播放
        }

        public void Stop()
        {
            //停止播放
        }
    }

    class WordFile : DocFile
    {
        public override void Open()
        {
            Console.WriteLine("Open the Word file.");
        }
    }

    class PdfFile : DocFile
    {
        public override void Open()
        {
            Console.WriteLine("Open the Pdf file.");
        }
    }

    class JpgFile : ImageFile
    {
        public override void Open()
        {
            Console.WriteLine("Open the Jpg file.");
        }
    }

    class AviFile : MediaFile
    {
        public override void Open()
        {
            Console.WriteLine("Open the Avi file.");
        }
    }

    class MpegFile : MediaFile
    {
        public override void Open()
        {
            Console.WriteLine("Open the Mpeg file.");
        }
    }

    class LoadManager
    {
        private IList<Files> files = new List<Files>();

        public IList<Files> Files
        {
            get
            {
                return files;
            }
        }

        public void LoadFiles(Files file)
        {
            files.Add(file);
        }

        /// <summary>
        /// 打开所有文件
        /// </summary>
        public void OpenAllFiles()
        {
            foreach(IFileOpen file in files)
            {
                file.Open();
            }
        }

        /// <summary>
        /// 打开单个文件
        /// </summary>
        /// <param name="file">文件接口对象</param>
        public void OpenFile(IFileOpen file)
        {
            file.Open();
        }

        /// <summary>
        /// 获取文件类型
        /// </summary>
        /// <param name="fileName">文件名</param>
        /// <returns>文件类型</returns>
        public FileType GetFileType(string fileName)
        {
            FileInfo fi = new FileInfo(fileName);
            return (FileType)Enum.Parse(typeof(FileType), fi.Extension);
        }
    }

    class FileClient
    {
        static void Main(string[] args)
        {
            //首先启动文件加载器
            LoadManager lm = new LoadManager();
            //陆续添加要处理的文件
            lm.LoadFiles(new WordFile());
            lm.LoadFiles(new PdfFile());
            lm.LoadFiles(new JpgFile());
            //打开文件
            foreach (Files file in lm.Files)
            {
                //if(file is 爷爷选择的)
                //{
                //    file.Open();
                //}
                file.Open();
            }
            Console.ReadKey();
        }
    }

五、接口

  (1)本质:一种“契约”,用于规定一种规则由大家遵守;通过IL分析(借助于Reflector工具)可知,接口本质上仍然被标记为.class,一个不能被实例化的类。实现了接口的类方法在IL标记为override,表示覆写了接口方法实现。

  public interface IDriveable
    {
        void Drive();
    }

    public class BusDriver : IDriveable
    {
        public void Drive()
        {
            Console.WriteLine("有经验的司机可以驾驶公共汽车。");
        }
    }

    public class CarDriver : IDriveable
    {
        public void Drive()
        {
            Console.WriteLine("小车司机开小汽车。");
        }
    }

    public class TractorDriver : IDriveable
    {
        public void Drive()
        {
            Console.WriteLine("拖拉机司机驾驶拖拉机。");
        }
    }

    public class AircraftDriver : IDriveable
    {
        public void Drive()
        {
            Console.WriteLine("飞行员可以驾驶飞机。");
        }
    }

    public class DriverSchool
    {
        public static void Main_1_5_1()//Main_1_5_1
        {
            IList<IDriveable> drivers = new List<IDriveable>();
            drivers.Add(new BusDriver());
            drivers.Add(new CarDriver());
            drivers.Add(new TractorDriver());

            foreach (IDriveable driver in drivers)
            {
                driver.Drive();
            }
        }
    }

  (2)规则:

    • 接口隔离原则强调接口应该被实现为具有单一功能的小接口
    • 接口支持多继承,既可以作用于值类型也可以作用于引用类型
    • 接口不能被实例化,没有构造函数,接口成员被隐式声明为public
    • 禁止为已发布的接口添加新的成员

本章思维导图

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

时间: 05-21

《你必须知道的.NET》读书笔记一:小OO有大智慧的相关文章

面向对象--继承(你必须知道的.NET读书笔记)

1.什么是继承继承,就是面向对象中类与类之间的一种关系继承的实现方式:实现继承 接口继承 2.继承的本质(1)继承是可以传递的,子类是对父类的扩展,必须继承父类的方法,同时可以添加新方法(2)子类可以调用父类方法和字段,而父类不能调用子类方法和字段(3)虚方法如何实现覆写操作,使得父类指针可以指向子类对象成员(4)之类不单只继承父类的公有成员,同时继承了父类的私有成员,只是在之类中不被访问(5)new 关键字在虚方法继承中的阻断作用 实例说明: 1 internal class Program

C#刨根究底:《你必须知道的.NET》读书笔记系列

一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP-王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心得和感悟,将技术问题以生动易懂的语言展开,层层深入,以例说理.全书主要,包括了.NET基础知识及其深度分析,以.NET Framework和CLR研究为核心展开.NET本质论述,涵盖了.NET基本知识几乎所有的重点内容.全书分为5个部分,第1部分讲述.NET与面向对象,从底层实现角度分析了.NET如何实现面向

《你必须知道的.NET》读书笔记二:小OO有大原则

此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Facade模式.Proxy模式 (3)基本方法:Extract Interface 抽取接口.Extract Class 抽取类.Extract Method 抽取方法 (4)DEMO:数据库管理系统中根据不同权限进行CRUD操作(这里是使用Proxy模式重构后的代码)   (5)规则建议: ①一个类只有一个引

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①

《你必须知道的.NET》读书笔记:从Hello World认识IL

通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL是.NET框架中间语言(Intermediate Language)的缩写.使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的程序代码并不是CPU能直接执行的机器代码,而是一种中间语言IL(Intermediate Language)的代码. 1.2 为何要了

《你必须知道的.NET》读书实践:一个基于OO的万能加载器的实现

此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如:文档.图片和影音文件等,只需要安装一个程序就可以免去其他应用文件的管理(你让其他耗费了巨资打造的软件情何以堪...),于是就有了这个万能加载器(FileLoader). 初步分析之后,小王总结了这个万能加载器的功能点如下: (1)能够打开常见文档类资料:txt.word.pdf.visio等: (2)能够打开

《你必须知道的495个C语言问题》笔记--库函数

怎样把数字转为字符串(与atoi相反)?有itoa函数吗? 用sprintf就可以了: sprintf(string, "%d", number); 同理,也可以同sprintf把long型或浮点型转换成字符串(使用%ld或%f),也就是说,可以把sprintf看成是atol或者atof的 反函数. 怎样在日期上加n天?怎样取得两个日期的时间间隔? 第一个问题,mktime接受没有规范话的日期,所以可以用一个日期的struct tm结构,直接在tm_mday域上进行加减,然后 调用mk

《你必须知道的495个C语言问题》笔记--杂项

如何进行移位操作? 因为左移操作(<<)不会导致符号位出现缺位,不考虑符号位,低位补0即可.所以对于无符号和有符号数来说,均为逻辑左移. 右移操作(>>)会涉及到符号位出现缺位的问题,所以在有符号数的右移操作时要考虑符号位怎么补的问题.对于无符号数来说, 最左侧补0,即逻辑右移:对于有符号来说,最左侧补符号位,即符号右移. 实践: #include <stdio.h> int main(void) { unsigned rui; int ri; unsigned int

《你必须知道的495个C语言问题》笔记--标准输入输出

getchar的返回值 这样的代码有什么问题: char c; while((c = getchar()) != EOF).... getchar返回值变量必须是int型.因为EOF通常定义为-1,二十进制为255的字符会被符号扩展,和EOF比较时会相等,从而 过早第结束输入. feof函数的使用 为什么这些代码最后一行复制了两遍? #include <stdio.h> #include <unistd.h> #include <fcntl.h> #define MAX