《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 git 保存用户名和密码

    一.通过文件方式 1.在~/下, touch创建文件 .git-credentials, 用vim编辑此文件,输入内容格式: touch .git-credentials vim .git-crede ...

  2. Prometheus介绍

    Prometheus的主要特点 Prometheus 属于一站式监控告警平台,依赖少,功能齐全.Prometheus 支持对云的或容器的监控,其他系统主要对主机监控.Prometheus 数据查询语句 ...

  3. Ubuntu16.04下安装OpenCV2.4.13

    软件版本 Ubuntu 16.04; OpenCV 2.4.13 安装步骤 1.首先安装一些编译工具 # 安装编译工具 sudo apt-get install build-essential # 安 ...

  4. Python面向过程编程

    面向过程编程 D:\Document\视频\python20期\day4\视频\面向过程编程 三元表达式示例1 #三元表达式x=10 y=20 res=x if x>y else y print ...

  5. java基础-反射(细节)

    java面试题--java反射机制? Java反射机制的作用:1)在运行时判断任意一个对象所属的类.2)在运行时判断任意一个类所具有的成员变量和方法.3)在运行时任意调用一个对象的方法4)在运行时构造 ...

  6. Linux背背背(4)vim操作

    目录 1.打开文件 2.vim的三种模式 3.扩展 (关于vi 和 vim 的区别,它们都是多模式编辑器,不同的是vim 是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面.) 1 ...

  7. vue仿淘宝订单状态的tab切换效果

    <div class="navigation">  //这里是通过循环遍历出来的数据,你需要根据index的值来判断你现在点击的是第几个tab栏导航,同时在js中写一个 ...

  8. 装饰器,栈 ,asyncio 代码

    装饰器目的: 不改变原来代码的基础上. 给函数添加新功能动态代理. 拦截器 通用装饰器的写法def wrapper(fn): def inner(*args, **kwargs): '''之前''' ...

  9. Java 学习 注解

    转载:https://blog.csdn.net/briblue/article/details/73824058 注解语法 因为平常开发少见,相信有不少的人员会认为注解的地位不高.其实同 class ...

  10. yarn 报错 requested virtual cores < 0, or requested virtual cores > max configured, requestedVirtualCores=6, maxVirtualCores=4 原因

    INFO ApplicationMaster:54 - Final app status: FAILED, exitCode: 13, (reason: Uncaught exception: org ...