《C#从现象到本质》读书笔记(四)第4章C#和面向对象
《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#和面向对象的更多相关文章
- 《深入理解java虚拟机》读书笔记四——第五章
第五章 调优案例分析与实战
- 【转】Verilog HDL常用建模方式——《Verilog与数字ASIC设计基础》读书笔记(四)
Verilog HDL常用建模方式——<Verilog与数字ASIC设计基础>读书笔记(四) Verilog HDL的基本功能之一是描述可综合的硬件逻辑电路.所谓综合(Synthesis) ...
- 【转载】MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
1. Set - 元组的集合,在 Set 中的元组用逗号分开,Set 以花括号括起来,例如: { ([Product].[Category].[Accessories]), ([Product].[ ...
- 《Android开发艺术探索》读书笔记 (3) 第3章 View的事件体系
本节和<Android群英传>中的第五章Scroll分析有关系,建议先阅读该章的总结 第3章 View的事件体系 3.1 View基本知识 (1)view的层次结构:ViewGroup也是 ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- 《Android开发艺术探索》读书笔记 (13) 第13章 综合技术、第14章 JNI和NDK编程、第15章 Android性能优化
第13章 综合技术 13.1 使用CrashHandler来获取应用的Crash信息 (1)应用发生Crash在所难免,但是如何采集crash信息以供后续开发处理这类问题呢?利用Thread类的set ...
- 《Linux内核设计与实现》读书笔记——第一、 二章
<Linux内核设计与实现>读书笔记--第一. 二章 标签(空格分隔): 20135321余佳源 第一章 Linux内核简介 1.Unix内核特点 十分简洁:仅提供几百个系统调用并且有明确 ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- 《Android开发艺术探索》读书笔记 (9) 第9章 四大组件的工作过程
第9章 四大组件的工作过程 9.1 四大组件的运行状态 (1)四大组件中只有BroadcastReceiver既可以在AndroidManifest文件中注册,也可以在代码中注册,其他三个组件都必须在 ...
- JavaScript DOM编程艺术读书笔记(四)
第十章 实现动画效果 var repeat = "moveElement('"+elementID+"',"+final_x+","+fin ...
随机推荐
- if else和switch case那个效率更高一点
switch...case写法: switch (表达式){ case 值1 : 语句1 break; case 值2 : 语句2 break; ... default : 语句n break; } ...
- .net 调用 Matlab生成dll出现的问题(The type initializer for 'MathWorks.MATLAB.NET.Utility.MWMCR' threw an exception.)
https://cn.mathworks.com/matlabcentral/answers/278399-i-get-an-error-saying-the-type-initializer-for ...
- 验证Textbox的字符长度
private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e) { ) { //Indi ...
- Altium Designer9.4局域网内冲突的问题
Altium Designer破解 1.安装Altium Designer原程序.2.运行AD9KeyGen,点击“打开模板”,加载ad9.ini,如想修改注册名,只需修改:TransactorNam ...
- Linux常用命令大全(分类)
首先按ESC键回到命令模式: vi保存文件有不同的选项,对应于不同的命令,你可以从下面的命令中选择一个需要的::w 保存文件但不退出vi :w file 将修改另外保存到file中,不退出vi:w! ...
- openstack网络
OpenStack中neutron的2种ip.3种管理模式 Nova有固定IP和浮动IP的概念.固定IP被分发到创建的实例不再改变,浮动IP是一些可以和实例动态绑定和释放的IP地址. Nova支持3种 ...
- Linux 关机、重启 命令
重启命令:1.reboot2.shutdown -r now 立刻重启(root用户使用)3.shutdown -r 10 过10分钟自动重启(root用户使用) 4.shutdown -r 20:3 ...
- 深度学习原理与框架-Tensorflow卷积神经网络-cifar10图片分类(代码) 1.tf.nn.lrn(局部响应归一化操作) 2.random.sample(在列表中随机选值) 3.tf.one_hot(对标签进行one_hot编码)
1.tf.nn.lrn(pool_h1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75) # 局部响应归一化,使用相同位置的前后的filter进行响应归一化操作 参数 ...
- 预浸料(Prepreg,PreimpregnatedMaterials)
预浸料(Prepreg,PreimpregnatedMaterials),是把基体(Matrix)浸渍在强化纤维(Reinforced Fiber)中制成的预浸片材产品,是复合材料的中间材料.
- A CLOSER LOOK AT CSS
A CLOSER LOOK AT CSS css-review Congratulations! You worked hard and made it to the end of a challen ...