zoukankan      html  css  js  c++  java
  • C# 面向对象之概念理解(2)

    委托

    如果对象A为了满足某个请求,而寻求另一个对象B的帮助,这被称作是A对B的委托。

    对象间的委托,和现实世界中人与人之间的委托一样:如果你“那位”要求你在他外出公干期间帮忙助剪草坪,而你转而雇佣邻居小孩干活,只要他不偷懒,则草坪就不会疯长。

    对象之间发生委托,同样也不会为消息发出者所知。

    对象的访问

    • 对象A向对象B传递消息的唯一途径,是A能访问B的句柄。有以下几可能:
    • 对象A可能把对象B的引用当作一个attribute维护;
    • 对象B作为一个参数传递到A的一个方法;
    • 对象B的引用,可能对于整个应用程序是“全局引用”;
    • 对象A可以调用第三个对象C,明确地要求或得到B的引用。

    引用变量有时被非正式地看做“抓住了”对象,所以我们常使用非正式术语句柄作类似这样的表达。

    如果对象A是对象B的客户,则对象B就被认为是A的服务供应者。

    封装

    表示将对象状态和行为绑到单一逻辑单元中的机制。

    •  避免对封装数据未经授权访问。
    • 帮助确保数据完整。
    • 当私有特征改变时限制连锁反应。
    •  在类的自身方法中使用访问器

    信息隐藏是一种强大的机制,它保护对象数据的完整性,也能在应用程序的私有实现细节被不可避免地修改时防止客户代码出现连锁反应。

    对象间关系:

    类与类之间结构关系的正式名称是“关联”。关联是指类间关系,术语“链接”则是指两个特定对象(实体)间的结构关系。

    关联与链接不同:

    1. 关联是某个类/类型的对象间可能存在的关系;
    2. 链接是这些特定类型的对象间实际存在的关系。

    换言之,关联让链接称为可能。

     

    定义两个不同类之间的关联关系,称为二元关联。

    相同类的两个实体间的关系,称为反身关联。

    结构关系

    一对一(1:1);

    一对多(1:m)

    多对多(m:m)

    注意,结对关系的概念只是用与关联,不适用于链接。

    聚合

    聚合:是一种特殊形式的关联,它指明“包括”、“由……构成”或“有……”的关系。和关联一样,聚合用于描述类A和类B之间的关系,不同的是,我们可以用聚合表述更多种关系:某对象属于类A,类A就是聚合类,类A包括一些类型为B的组件对象,或由一些类型为B的组件对象聚合而成。含有“包括”、“由……组成”等短语来命名这种关系,则该关系极有可能是一种聚合关系。

    继承

    继承常常指出两个类之间的“A是B”关系,因为如果类B派生自类A,则B则是A的一种特例。基类具有的特点对于其派生类都适用。

    继承相关术语:

    • 特殊化:被用来指称从一个类派生新类的过程。
    • 普遍化:则用来指称相反过程:从几个现存类中找出共性,为它们创造一个新的共同基类。

    层次结构

    • 把层次结构中每个类称作一个节点;
    • 任意一个节点被看作(直接或间接地)派生自该层次结构中它上方的节点,这些节点总括起来称作它的祖先;
    • 如果一个祖先节点刚好在紧邻指定节点的上方,则被看做指定节点的直接基类;
    • 层次结构中位于给定节点下发的所有节点被称作它的子孙;
    • 层次结构顶端的节点被称作根节点;
    • 一个末梢、一片叶子或节点,是指没有后代的节点;
    • 派生自同一个直接基类的节点是兄弟。

    继承真的是一种类间关系吗?

    关联、聚合和继承都被称作是类间关系。继承与关联、聚合在对象层级上有所区别。

    关联(和作为特殊关联的聚合)可以看作依靠相关类之间的现存关联把独立的对象联系起来,与之不同,继承是描述单个对象特征的一种方式。在继承的情形中,对象同时也是派生类和该派生类的所有基类的实体。

    层级结构中的所有类——A及其所有子类——都可以来创建根对象。

    通过继承,一个对象可以拥有“多重身份”。例如:研究生(GraduateStudent)是学生(Student)也是人(Person)。

    类的派生规则:所可为

    • 可以通过添加特征来扩展基类。
    • 可以特质话执行派生类,执行从其基类继承的一个或多个服务的操作方式(重写)。

    派生类规则:当不为。

    不应该改变特征的语义——即蕴含的目的、表达的意义。

    • 不可改变特征语义
    • 不可移除特征
    • 不可修改返回(Property)类型
    • 不可试图改变方法头

    ps:这里从层次结构来看,确实和javaScript里的文档结构有点类似。不过理解时须知,为什么要继承?不单单是为了重用代码,还为了扩展基类的功能(既然是扩展,那么必然具有基类的功能)或重写基类的功能。还有一点:在非叶类已经在应用程序代码中被使用后,如非万不得已,应避免向其添加新特征,以防在整个类继承结构中导致连锁反应(封闭开发原则)。

    多载

    多载允许同一个类两个或多个不同方法拥有相同方法名和不同的参数签名。

    多重继承

    如果出于某种目的,需要把两个不同基类的要素融合到一起,创建一个混血类,就得使用多重继承。使用多重继承,类层次结构中的每个类都被允许拥有两个或多个直接祖先类。

    表面看起来易如反掌,事实确是:C#语言不支持多重继承。

    为什么不支持呢?

    根源在于,如果这些基类:拥有同样的签名的方法,但方法体具体实现不同;拥有同样attribute(同样名称和同样类型);拥有同样attribute,但类型不同;在编译时就会造成重复:编译器没有办法知道应该移除哪一个或者继承哪一个,而我们不该移除任何一个(因为它们表达了不同的信息)。这就是OO编程语言实现多重继承之痛。Ps:说白了就是:编译器过不了,我们不放过,这也就是引出了抽象类,接口的出现(下节再说)。

  • 相关阅读:
    Logback日志格式配置相关记录
    前后端分离验证码之cookie+redis方案
    聊一聊Swagger ui登录功能实现方案
    nginx-thinkphp5
    jmeter常用的性能测试监听器
    jvm内存
    TCP连接状态详解
    原生Javascript实现图片轮播效果
    适用于CSS2的各种运动的javascript运动框架
    JS中for循环里面的闭包问题的原因及解决办法
  • 原文地址:https://www.cnblogs.com/anlen/p/3600766.html
Copyright © 2011-2022 走看看