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

一、对象

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

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

  (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 > ) && (value < ))
{
age = value;
}
else
{
throw new ArgumentOutOfRangeException("年龄信息不正确。");
}
}
} private string password; //用户密码 public string Password
{
get { return password; }
set
{
if (value.Length < )
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 ;
}
} 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/

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

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

  1. 你必须知道的.net读书笔记之第二回深入浅出关键字---对抽象编程:接口和抽象类

    请记住,面向对象思想的一个最重要的原则就是:面向接口编程. 借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程. 抽象类应主要用于关系密切的对象,而接口 ...

  2. 你必须知道的.net读书笔记第四回:后来居上:class和struct

     基本概念 1.1. 什么是class? class(类)是面向对象编程的基本概念,是一种自定义数据结构类型,通常包含字段.属性.方法.属性.构造函数.索引器.操作符等.因为是基本的概念,所以不必在此 ...

  3. 必须知道的.net——学习笔记1

    1.对象的生成(出生) Person aperson=new Person("小张",25) 构造过程:分配存储空间—初始化附加成员—调用构造函数 2.对象的旅程(在一定的约定与规 ...

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

    一.此书到底何方神圣? <你必须知道的.NET>来自于微软MVP—王涛(网名:AnyTao,博客园大牛之一,其博客地址为:http://anytao.cnblogs.com/)的最新技术心 ...

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

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.单一职责原则 (1)核心思想:一个类最好只做一件事,只有一个引起它变化的原因 (2)常用模式:Fa ...

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

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.依赖也是哲学 (1)本质诠释:“不要调用我们,我们会调用你” (2)依赖和耦合: ①无依赖,无耦合 ...

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

    通用的语言基础是.NET运行的基础,当我们对程序运行的结果有异议的时候,如何透过本质看表面,需要我们从底层来入手探索,这时候,IL便是我们必须知道的基础. 一.IL基础概念 1.1 什么是IL? IL ...

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

    此篇已收录至<你必须知道的.Net>读书笔记目录贴,点击访问该目录可以获取更多内容. 一.关于万能加载器 简而言之,就是孝顺的小王想开发一个万能程序,可以一键式打开常见的计算机资料,例如: ...

  9. (转)【推荐】初级.NET程序员,你必须知道的EF知识和经验

    转自:http://www.cnblogs.com/zhaopei/p/5721789.html [推荐]初级.NET程序员,你必须知道的EF知识和经验   阅读目录   [本文已下咒.先顶后看,会涨 ...

随机推荐

  1. io流(详询请加qq:2085920154)

    import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class ioTest ...

  2. C语言实现 二分查找数组中的Key值(递归和非递归)

    基本问题:使用二分查找的方式,对数组内的值进行匹配,如果成功,返回其下标,否则返回 -1.请使用递归和非递归两种方法说明. 非递归代码如下: #include <stdio.h> int ...

  3. jQuery动画特效笔记

    show().hide().fadeIn().fadeOut().slideDown.slideUp.slideToggle()都接受可选的时长和回调参数(选项对象参数). toggle(durati ...

  4. jsp文件引入js文件的方式(项目部署于web容器中)

    在页面中引入javascript文件的方式是多种多样的,本文介绍两种. 通过<script>标签插入js文件 通过这种方式引入的js,写对js文件和jsp文件的路径很重要.下面给出一个项目 ...

  5. Java 内部类摘抄

    关于Java的内部类,要说的东西实在太多,这篇博文中也无法一一具体说到,所以就挑些重点的讲.关于内部类的使用,你可能会疑问,为什么我们要使用内部类?为了回答这个问题,你需要知道一些关于内部类的重点.所 ...

  6. ubuntu与win10互换硬盘

    实例:将sdb上的ubuntu转移至sda,将sda上的win转移至sdb1. 备份资料2. 制作老毛桃PE盘3. 格式化sda4. dd if=/dev/sdb of=/dev/sda ,将sdb克 ...

  7. PHP入门教程-开发环境搭建

    1.PHP简介: PHP是能让你生成动态网页的工具之一.PHP网页文件被当作一般HTML网页文件来处理并且在编辑时你可以用编辑HTML的常规方法编写PHP. 2.学习需要基础: a.HTML b.Ja ...

  8. 百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里?

    好多人在问:如何将百度地图里面搜索到的公司商家电话导出表格?怎样将把百度地图里面搜索到的公司 电话 地址 等数据导出excel里? 现在,很多人都在网络上找商家,联系业务. 百度地图里有很多的商家联系 ...

  9. html5 上传头像的裁剪

    本示例使用HTML5 canvas,简单的编写了上传头像的裁剪效果,移动端支持拖拽后裁剪, 虽然样式不好看,但是功能还算全: 下图为裁剪后的效果: html部分: <!DOCTYPE html& ...

  10. 控制iframe高度

    1. iframe自适应高度 <iframe id="iframe" src="#" frameborder="0" scrollin ...