OOP支柱

3 个核心:封装 继承 多态

封装就是将实现细节隐藏起来,也起到了数据保护的作用。

继承就是基于已有类来创建新类可以继承基类的核心功能。

在继承中

另外一种代码重用是:包含/委托,这种重用不是父子类的继承关系,而是一个类定义为另一个类的成员变量。

一个简单的例子,汽车和收音机,汽车里面有一个收音机,不能说继承,不符合逻辑,只能说是一种对象包含了另一个对象。汽车对象中调用了收音机对象中的方法。

多态就是同一请求,不同的响应操作。

多态

同一种方式处理相关对象的能力。

相同的请求操作不同。

两个原则:里氏替换原则:子类对象能够替换其基类对象被使用。

开放封闭原则:对外扩展开放,对内修改封闭。

定义一个抽象方法,派生类重写抽象方法具体实现。

Aniaml an=new Cat();//开辟一个新空间指向派生类对象

通过创建an 就可以指向多个派生类对象。

an= new dog();

an=new chicken();

创建cat对象,基类指向子类

Public公共的没有限制

Private私有的 本类可用

Protected 本类和子类使用

set get方法就是最基础的封装。

.NET语言提倡使用属性来强制封装状态数据。属性会总是映射到“实际的”访问方法和修改方法。创建了属性会在背后调用相应的get 和set来封装。

封装具有安全性,封装可以方便以后的修改。Get可以表示具有只读属性,Set可以表示具有只写功能。

属性内部表示

如果已经写了封装set get方法又重新定义了set get方法那么编译会出错,基础类库会使用类型属性而不是传统的访问和修改方法。

Public string company//封装没有括号()
{
Get{return companyName;}
Set(companyName=value;)
}//手动属性
public int Num{get;set;}//自动属性

自动属性必修同时支持读写功能。

Const用来定义常量

比如我定义一个π值

Public const double pai=3.14;

Ps:关键字都是加字数据类型前面

Readonly只读字段 和常量相似 不能在赋初始值后改变。

但和常量也有不同的地方。

赋给只读字段的值可以在运行时决定,因此在构造函数中赋值是合法的。例如:

Class{

Public readonly double pi;

Public class(){

Pi=3.14;

}

}

继承与多态

在C#中定义冒号:操作类之间的关系。

例如:MiVan继承Car类

Class MiVan:Car

{

}

MiVan可以调用父类的公共属性,继承保护了封装,无法访问私有成员。

.NET不允许多重继承

可以将类、结构或接口的定义拆分到两个或多个源文件中,在类声明前添加partial关键字即可。

Sealed关键字

防止发生继承

创建子类对象访问基类功能,并扩展。

Base关键字

静态成员只能由类来访问,不能由对象来访问。

Base和this都是访问类的实例

一般基类的默认构造函数会被自动调用

上述例子,显示调用合适的自定义基类构造函数。解决只读问题和低效性。增加了自定义的构造函数,就把默认的构造函数自动移除了,所以得重新定义默认构造函数。

基类加Protected关键字

好处:派生类就可以直接访问基类的信息。

坏处:有可能绕过公共属性设置的业务规则。

受保护的数据被认为是私有的。

包含/委托编程

Has-a关系

简单的说,委托就是增加公共成员到包含类,以便使用被包含对象的功能。

非嵌套类不能使用private关键字声明。

Public class OuterClass

{

//公共嵌套类型可以被任何人使用

Public class PublicInnerClass()

//私有嵌套类型只可以被包含类的成员使用

Private class PrivateInnerClass()

}

C#多态

相同的请求做出不同的响应。

如果基类希望定义由子类重写的方法,必须加上virtual关键字。

如果子类希望改变虚方法的实现细节,必须使用override关键字。

可以通过base关键来使用默认行为

例如:

Base.GiveBonus();

使用了基类的默认行为。

抽象类

防止创建模糊的基类,使用abstract关键字。

Abstract class Employee

{

}

构建多态接口

抽象方法只可以在抽象类中

dynamic 类似于javascript中的Var 弱类型(与底层打交道会用的到)

最新文章

  1. Tomcat启动时项目重复加载,导致资源初始化两次的问题
  2. Lua基础之语法
  3. eclipse连接远程Hadoop报错,Caused by: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
  4. 基于redis实现的分布式锁
  5. c语言通过89C51驱动1602液晶显示(入门级别)
  6. gitHub远程分支创建
  7. WebLogic简单的备份和恢复
  8. java面试大全
  9. cocos2dx进阶学习之CCDirector
  10. hdu 1239 Calling Extraterrestrial Intelligence Again (暴力枚举)
  11. 利用sqoop将hive数据导入导出数据到mysql
  12. 【BZOJ】3926: [Zjoi2015]诸神眷顾的幻想乡
  13. nginx的url规则小tips
  14. 使用idea 在springboot添加本地jar包的方法
  15. centos 上安装nodejs v8.0.0
  16. centos云服务器安装Python3记录
  17. css总结5:px、em、rem区别介绍
  18. 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA
  19. 基于Linux的智能家居的设计(5)
  20. Easyui-交互式消息弹出框

热门文章

  1. PDFCrop裁剪PDF文档使用方法
  2. 万能的TextView,实现常用布局样式
  3. 阶段3 2.Spring_06.Spring的新注解_2 spring的新注解-Bean
  4. 三十四:数据库之SQLAlchemy外建及四种约束
  5. 解密Go语言之 pprof
  6. LeetCode.1051-身高检查器(Height Checker)
  7. 学习Go语言(二)快速入门
  8. HTML协义代码
  9. 9.Jmeter 多个threadgroup 中的配置元件会一次性进行初始化
  10. javascript 数据类型之数值转换