《C#从现象到本质》读书笔记第4章C#和面向对象

面向对象程序设计OOP

面向对象的三大特性是:

1)封装:类可以将它的成员私有化,只暴露它认为应当暴露给外界的成员。通过私有化成员,外界不必了解这些成员的实现细节。

2)继承:子类可以继承父类,从而简单地自动实现父类所有的成员,并增加自己的成员。通过方法的重写和隐藏,子类还可以修改父类的行为。

3)多态:实际上是继承的一种特殊情况,此时,子类一定会复写父类的行为(通常父类没有提供代码)。接口和抽象类都是多态的体现。

通过继承和多态,增强代码的复用功能。通过封装避免不合理的访问。

在创建子类对象时,子类的方法表包括了父类的虚方法和指向父类方法表的指针,使得子类可以调用父类的方法。另外,如果存在方法的重写,则会用子类的方法替代掉父类的方法。

子类型可以使用override显式地重写该方法,或者使用new隐藏该方法。

 class Program
{
static void Main(string[] args)
{
A a=new A();
a.NormalMethod();//A.NormalMethod
a.NewMethod();//A.NewMethod B b=new B();
b.NormalMethod();//B.NormalMethod"
b.NewMethod();//B.NewMethod A a2=new B();
a2.NormalMethod();//B.NormalMethod"
a2.NewMethod();//A.NewMethod
Console.ReadKey();
}
} internal class A
{
public virtual void NormalMethod()
{
Console.WriteLine("A.NormalMethod");
}
public virtual void NewMethod()
{
Console.WriteLine("A.NewMethod");
}
} class B:A
{
public override void NormalMethod()
{
Console.WriteLine("B.NormalMethod");
}
public new void NewMethod()
{
Console.WriteLine("B.NewMethod");
}
}

抽象类(abstract修饰类或者方法)不能建立实例;不能密封抽象类因为这违反了它只有被继承才有意义的原则;抽象类只有被派生类继承才有意义;抽象方法必须放置在抽象类中。抽象类可以拥有非抽象方法,而接口作为一个特殊的抽象类,不能含有非抽象的方法。

抽象类和接口有一些区别,接口是一种特殊的抽象类:

1)接口不能有非抽象方法,而抽象类可以有非抽象方法。

2)接口和抽象类都不能被实例化。

3)如果继承接口,必须实现接口所有的抽象方法。而继承抽象类的类可以只实现一部分父类的抽象方法。

4)一个类可以继承多个接口,但只能继承自一个别的类。

5)不能密封抽象类和接口。因为这破坏了接口和抽象类本身的性质,即被人继承。

抽象类和它的子类之间应该是一般和特殊的关系,而接口仅仅是它的子类应该实现的一组规则。

面向对象编程五大规则SOLID

1)单一职责原则:有且仅有一个原因引起类的变更。低耦合,高内聚。SPR。

2)开闭原则:软件实体应当对修改关闭,对扩展开放。对抽象编程,因为抽象相对稳定。OCP。工厂方法模式。

3)里式替换原则:所有引用积累的地方必须能够透明地使用其子类的对象。子类必须能够替换其基类。LSP。

4)接口隔离原则:尽量应用专门的接口,而不是单一的总接口,接口应该面向用户,将依赖建立在最小的接口上。客户端不应该依赖它不需要的原则。ISP。

5)依赖倒置原则:依赖于抽象,而不要依赖于具体,因为抽象相对稳定。高层模块不应该依赖底层模块,两者都应该依赖其抽象,抽象不应该依赖于细节,细节应该依赖抽象。DIP。

《C#从现象到本质》读书笔记(四)第4章C#和面向对象的更多相关文章

  1. 《深入理解java虚拟机》读书笔记四——第五章

    第五章 调优案例分析与实战

  2. 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)

    Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...

  3. 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)

    1. Set  - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...

  4. 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系

    本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...

  5. SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

    SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...

  6. 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化

    第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...

  7. 《Linux内核设计与实现》读书笔记——第一、 二章

    <Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...

  8. how tomcat works 读书笔记四 tomcat的默认连接器

    事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...

  9. 《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程

    第9章 四大组件的工作过程 9.1 四大组件的运行状态 (1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在 ...

  10. JavaScript DOM编程艺术读书笔记(四)

    第十章 实现动画效果 var repeat = "moveElement('"+elementID+"',"+final_x+","+fin ...

随机推荐

  1. linux系统常用的基本命令分类

    linux系统常用的基本命令分类: 文件命令:vim vimdiff diff mkdir touch rm mv cp ln cd ls more less head tail cat grep e ...

  2. 《企业IT架构转型之道》读书笔记

    1 出发点:企业IT系统建设普遍面临的问题和处境 很多企业面临的问题和处境: 『烟囱式』系统建设模式. 当业务部门提出业务需求,信息中心部门进行系统集成商的招投标,再进入到需求收集.需求分析.开发.测 ...

  3. SELINUX工作原理

    SELinux工作原理 1. 简介 SELinux带给Linux的主要价值是:提供了一个灵活的,可配置的MAC机制. Security-Enhanced Linux (SELinux)由以下两部分组成 ...

  4. eclipse中配置MAVEN并使用阿里云代理

    一.下载MAVENhttp://maven.apache.org/download.cgi 二.配置MAVEN环境变量名:M2_HOME变量值:F:\maven\apache-maven-3.0.3找 ...

  5. ARM920T的Cache

    转载自:http://www.eefocus.com/mcu-dsp/242034 ARM920T有16K的数据Cache和16K的指令Cache,这两个Cache是基本相同的,数据Cache多了一些 ...

  6. rabbitmq (二) 持久化

    默认情况下rabbitmq 是根据消费者多少依次投递,投递后就删除消息. 消息不会重复投递给不同的消费者. 消费者如果遇到长时间的任务,会执行完一个消息之后再执行下一个消息, 消费者持久化: 如果一个 ...

  7. SpringMVC的工作流程、组件说明以及常用注解说明

    1. SpringMVC处理流程 2. SpringMVC架构 2.1 框架结构 2.2 框架流程 1. 用户发送请求至前端控制器DispatcherServlet. 2. DispatcherSer ...

  8. 一份快速完整的Tensorflow模型保存和恢复教程(译)(转载)

    该文章转自https://blog.csdn.net/sinat_34474705/article/details/78995196 我在进行图像识别使用ckpt文件预测的时候,这个文章给我提供了极大 ...

  9. shareSdk分享图片

    /** * 只分享图片 * * @param bitmap bitmap */ private void sharedImage(Bitmap bitmap) { RxPermissions rxPe ...

  10. leetcode98

    class Solution { public: vector<int> V; void postTree(TreeNode* node) { if (node != NULL) { if ...