面向对象语言代表C++
继承
继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易。这样做,也达到了重用代码功能和提高执行效率的效果
一个类可以派生自多个类
一个类可以从多个基类继承数据和函数
继承多个类可以这样写
class Rectangle: public Shape, public PaintCost
权限控制
虚函数
虚函数是在基类中使用关键字 virtual 声明的函数
多态
C++ 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数
// 基类
class Animal {
virtual void eat()=0;纯虚函数,不需要实现函数内部
void sleep(){
cout<<"Animal need sleep"<<endl;
}
};
//派生类
class Dog : public Animal { //继承
void eat(){//实现继承的方法
cout<<"Dog can eat"<<endl;
}
};
class Cat : public Animal { //继承
void eat(){//实现继承的方法
cout<<"Cat can eat"<<endl;
}
};
void Aeat(&animal){
animal.eat();
}
int main(){
Cat cat;
Aeat(cat);
Dog Dog;
Aeat(Dog);
}
以上根据调用函数的对象来调用不同的成员函数
输出为
Cat can eat
Dog can eat
闭包是什么
闭包(closure)是一个函数以及其捆绑的周边环境状态(lexical environment,词法环境)的引用的组合。换而言之,闭包让开发者可以从内部函数访问外部函数的作用域。在 JavaScript 中,闭包会随着函数的创建而被同时创建。
function init() {
var name = "Mozilla"; // name 是一个被 init 创建的局部变量
function displayName() { // displayName() 是内部函数,一个闭包
alert(name); // 使用了父函数中声明的变量
}
displayName();
}
init();
init() 创建了一个局部变量 name 和一个名为 displayName() 的函数。displayName() 是定义在 init() 里的内部函数,并且仅在 init() 函数体内可用。请注意,displayName() 没有自己的局部变量。然而,因为它可以访问到外部函数的变量,所以 displayName() 可以使用父函数 init() 中声明的变量 name
developer.mozilla.org/zh-CN/docs/…
多范式代表 Javascript
基于原型和头等函数的多范式语言
-
过程式
-
面向对象
-
函数式
-
响应式
程序语言特性
- 是否允许副作用
- 操作的执行顺序
- 代码组织
- 状态管理
- 语法和词法
面向过程式编程有什么缺点?
- 数据与算法关联弱
- 不利于修改和扩充
- 不利于代码重用 面向对象的三大特性是"封装、"多态"、"继承”
面向对象编程五大原则
单一职责原则SRP(Single Responsiblity Principle) 一个类应该有且只有一个去改变它的理由,这意味着一个类应该只有一项工作。
开放封闭原则OCP(Open - Close Principle) 对扩展开放,对修改封闭
里式替换原则LSP(the Liskov Substitution Principle LSP)每一个子类或派生类应该可以替换它们基类或父类,在对象x为类型T时q(x)成立,那么当S是T的子类时,对象y为类型S时q(y)也应成立。(即对父类的调用同样适用于子类)
依赖倒置原则DIP(the Dependency Inversion Principle DIP) 依赖于抽象。具体而言就是高层模块不依赖于底层模块,二者都同依赖于抽象;抽象不依赖于具体,具体依赖于抽象
接口分离原则JSP(the Interface Segregation Principle ISP) 一个类对另外一个类的依赖应该建立在最小的接口上,不要强迫依赖不用的方法,这是一种接口污染。
面向对象编程有什么缺点?
面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要- -个香蕉,但得到的却是一个大猩猩拿着香蕉,而且还有整个丛林。 因为继承一个类就会继承那个类的属性和方法,相当于买东西捆绑销售了