一些面向对象概念

面向对象的简单概念

  1. 封装(Encapsulation)
  2. 抽象(Abstraction)
  3. 继承/泛化 (Inheritance/Generalization)
  4. 多态(Polymorphism)
  5. 接口(Interface)
  6. 消息传递(Message Sending)
  7. 关联(Association)
  8. 聚集(Aggregation)

封装

把对象的属性和方法结合成一个独立的系统单位,并尽可能地隐藏对象的内部细节。

封装概念

封装,即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。

通常封装指的是对一个类的结构定义(类声明),将属性与操作绑定在一起。
后来一些OOP语言给出了接口机制。这样,接口成为一种封装机制。一个对象形成两个部分:接口部分和实现部分。采用针对接口编程的思维方式,对于用户来说,就只有接口部分是可见的,而实现部分是不可见的。

------------------

例子(来自CSDN论坛):

CPU把所有的电阻电容门电路等都封装起来,只留出一些管脚(接口)让用户使用,CPU能暴露什么,不能暴露什么,是生产商设计决定的,用户不能直接操作CPU的电阻电容等等,但可以通过給管脚适当的电压来控制电阻电容等,也就是说用户不能直接访问CPU的属性,但是可以通过方法修改CPU的属性的值


抽象

在面相对象方法中的抽象,是指对具体的问题(对象)进行概括,抽出一类对象的公共性质并加以描述的过程。

一般来说,对一个问题的抽象应该包括两个方面:

  1. 数据抽象
    描述某类对象的属性或状态,也就是此类对象区别于彼类对象的特征

  2. 行为抽象(功能抽象)
    描述的是某类对象的公共行为或功能特征。

抽象对于建模者来说事最重要的技术,也就是说要搞清楚什么应该纳入模型中,什么应该舍弃。

来自百度知道:
什么叫抽象?

抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、葡萄、桃子等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。要抽象,就必须进行比较,没有比较就无法找到共同的部分。 共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃不同特征。所以抽象的过程也是一个裁剪的过程,不同的、非本质性的特征全部裁剪掉了。 所谓的共同特征,是相对的,是指从某一个刻面看是共同的。比如,对于汽车和大米,从买卖的角度看都是商品,都有价格,这是他们的共同的特征,而从其他方面来比较是,他们则是不同的。所以在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。 在软件开发过程中,识别稳定的需求、识别核心的需求、识别概念性的需求、设计系统的架构、定义系统中构件之间的接口关系等等都是抽象的过程,都是反应系统的本质特征的过程。 抽象的,才是稳定的,才是永恒的。 抽象的反义词是具体。人员往往会说:“你讲的太抽象了,能不能讲的具体一点?”在开发语言中,有抽象类,有具体类,具体类可以继承自抽象类,可以实例化。抽象类可以派生出众多的不同的具体类。所谓:“一生二,二生三,三生万物”。系统的稳定体现在抽象类,系统的变化体现在具体类。抽象类的层次要高于具体类。 系统因抽象而稳定,因抽象而生动。


继承

正如“一个学生是一个人”。继承表达的是对象间的 IS - A 关系。

利用继承,子类可以继承父类的属性和方法,在一些文献里,往往把子类/父类称作特殊类/一般类、子类/超类、派生类/基类。

继承是动态多态性的前提,也是OO与非OO程序设计语言的主要区别。


“一个学生是一个人,但一个人不一定是一个学生”。
派生类对象是一个基类对象,但基类对象不一定是一个派生类对象。

父类 a = new 子类();
例 : Person a = new Student();

-----------

多继承:菱形问题

图片:等待添加

子类的多个父类间也存在着直接或间接继承时,一个子类对象的实例化会造成祖先类构造函数的多次调用,从而对应有多份内存。产生一个子类对象是多个父类对象的悖论。

根本之道-取消类的多继承

-----------
继承与泛化的关系

继承是泛化的一类实现手段,泛化≠继承,它们是同一种关系在以不同中心对象时的不同说法,举个例子:

苹果继承水果
水果泛化苹果


多态

多态性是允许你将父对象设置成为一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作
(摘自“Delphi4 编程技术内幕”)

多态存在的三个必要条件
一、要有继承;
二、要有重写;
三、父类引用指向子类对象

C++中,实现多态有以下方法:虚函数,抽象类,覆盖,模板(重载和多态无关)。
区分多态和重载

----------------
覆盖、重载、多态的区分:

覆盖:在基类中实现一个非虚拟函数,然后子类中定义一个同名同返回同参数的函数

重载:在基类中实现一个非虚拟函数,子类中定义一个同名函数,返回值和参数不相同

多态:在基类中实现一个虚拟函数,子类中定义一个同名同返回同参数的函数,是三者中唯一一个使用动态绑定技术的情况。

Java多态性理解


接口与抽象类

–未完

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值