OOP三大核心封装继承多态

Posted cdjbolg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OOP三大核心封装继承多态相关的知识,希望对你有一定的参考价值。

OOP支柱

个核心:封装 继承 多态

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

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

在继承中

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

 

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

 

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

 

多态

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

相同的请求操作不同。

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

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

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

 

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 MiVanCar

{

}

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

.NET不允许多重继承

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

Sealed关键字

防止发生继承

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

 

Base关键字

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

Basethis都是访问类的实例

 技术图片

 

 

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

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

 

基类加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 弱类型(与底层打交道会用的到)

 

 

以上是关于OOP三大核心封装继承多态的主要内容,如果未能解决你的问题,请参考以下文章

OOP的三大特性是啥

OOP的三大特性------封装继承多态

java小白训练营day06-OOP:面向对象+封装+继承+多态

面向对象-封装继承多态(三大核心)尚未举例子

OOP 三大特征之多态(Polymorphism)

TS快速上手面向对象OOP - 封装 - 继承 - 多态