四、继承(上)

继承是面向对象编程中一个非常重要的特性,它也是另一个重要特性——多态的基础。

4.1 继承概念的引入

现实生活中的事物都归属于一定的类别。比如,狮子是一种动物。为了在计算机中模拟这种关系,面向对象的语言引入了继承(inherit)的特性。

构成继承关系的两个类中,动物称为父类(parent class)或基类(base class),狮子称为子类(child class)。

提示:

在一些书中,将父类称为超类(super class)。

“继承”关系有时又称为“派生”关系,“B继承自A”,可以说为“B派生自A”,或反过来说,“A派生出B”。

父类与子类之间拥有以下两个基本特性:

① 是一种(IS_A)关系:子类是父类的一种特例。

② 扩充(Extends)关系:子类拥有父类所没有的功能。

以下C#代码实现了狮子类与动物类之间的继承关系:

class Animal

{

}

class Lion:Animal

{

}

可以看到,C#中用一个冒号间隔开父类和子类。

4.2 类成员的访问权限 

面向对象编程的一大特点就是可以控制类成员的可访问性。当前主流的面向对象语言都拥有以下三种基本的可访问性:

可访问性 C#关键字 含义
公有 public 访问不受限制
私有 private 只有类自身成员可以访问
保护 protected 子类可以访问,其它类无法访问

(1)public和private

public和private主要用于定义单个类的成员存取权限。

请看以下示例代码:

public class A

{

public int publicI;

private int privateI;

protected int protectedI;

}

当外界创建一个A的对象后,只能访问A的公有实例字段publicI:

A a=new A();

a.publicI=100;  //OK!

类A的私有实例字段privateI只能被自身的实例方法所使用:

public class A

{

public int publicI;

private int privateI;

protected int protectedI;

private void f()

{

privateI=100;  //OK!

}

}

上述代码中,类A的私有方法f()访问了私有字段privateI。注意,只要是类A直接定义的实例方法,不管它是公有还是私有的,都可以访问类自身的私有实例字段。

(2)protected

在形成继承关系的两个类之间,可以定义一种扩充权限——protected。

当一个类成员被定义为protected之后,所有外界类都不可以访问它,但其子类可以访问。

以下代码详细说明了子类可以访问父类的哪些部分:

class Parent

{

public int publicField=0;

private int privateFiled=0;

protected int protectedField=0;

protected void protectedFunc()

{}

}

class Son:Parent

{

public void ChildFunc()

{

publicField=100;  //正确!子类能访问父类的公有字段

privateFiled=200;  //错误!子类不能访问父类的私有字段

protectedField=300;  //正确!子类能访问父类的保护字段

protectedFunc();  //正确!子类能访问父类的保护字段

}

}

当创建子类对象后,外界可以访问子类的公有成员和父类的公有成员,如下所示:

Son obj=new Son();

//可以调用子类的公有方法

obj.ChildFunc();

//可以访问父类的公有字段

obj.publicField=1000;

由此可见,可以通过子类对象访问其父类的所有公有成员,事实上,外界根本分不清楚对象的哪些公有成员来自父类,哪些公有成员来自子类自身。

小结一下继承条件下的类成员访问权限:

① 所有不必让外人知道的东西都是私有的。

② 所有需要向外提供的服务都是公有的。

③ 所有的“祖传绝招”,“秘不外传”的都是保护的。

(3)internal

C#中还有一种可访问性,就是由关键字internal所决定的“内部”访问性。

internal有点像public,外界类也可以直接访问声明为internal的类或类的成员,但这只局限于同一个程序集内部。

读者可以简单地将程序集理解为一个独立的DLL或EXE文件。一个DLL或EXE文件中可以有多个类,如果某个类可被同一程序集中的类访问,但其他程序集中的类不能访问它,则称此类具有internal访问性。

例如类库项目ClassLibrary1可以生成一个独立的程序集(假定项目编译后生成ClassLibrary1.DLL),其中定义了两个类A和B:

namespace ClassLibrary1

{

internal class A

{

internal int InternalI=0;

}

public class B

{

public void f()

{

A a=new A();   //OK!

a.InternalI=100;   //OK!

}

}

}

由于类B和类A属于同一个程序集,所以,B中的代码可以创建A的对象,并访问A的声明为internal的成员InternalI。

在程序集ClassLibrary1.DLL之外,外界只能创建声明为public的类B的对象,不能创建声明为internal的类A的对象。

internal是C#的默认可访问性,这就是说,如果某个类没有任何可访问性关键字在它前面,则它就是internal的。

比如上面的类A也可以写成:

class A

{

internal int InternalI=0;

}

它完全等同于

internal class A

{

internal int InternalI=0;

}

但要注意,在类中,如果省略成员的可访问性关键字,则默认为private的。

例如:

class A

{

int InternalI=0;

}

相当于

internal class A

{

private int InternalI=0;

}

使用场合 C#2.0 Visual Basic 2005 说明
Type(指类,接口等类型) public Public 访问不受限制
  internal Friend 访问范围仅限于同一程序集
Member(指类型中的成员,比如类中的字段) public Public 访问不受限制
  internal Friend 访问范围仅限于同一程序集
  protected protected 访问范围仅限于自己或派生出来的子类型
  protected internal Protected Friend 在同一程序集内访问不受限制,在不同程序集中仅由此类型派生出来的子类型可访问
  private Private 仅自己可以访问
时间: 2024-10-12 23:34:38

四、继承(上)的相关文章

Ansible 一步一步从入门到精通(四)上

一:一个简单的Playbook playbook比起shell脚本的优势,是幂等性,值得是运行一次和多次的结果都是一样的,不会对系统有影响 一个简单的playbook:   1 ---   2 - hosts:  all   3   tasks:   4   - name: Install Apache   5     yum:  name={{ item  }} state=present   6     with_items:  #定义上面的item变量   7     - httpd   

C++语言笔记系列之十四——继承后的访问权限

1.析构函数不继承:派生类对象在析构时,基类析构函数的调用顺序与构造函数相反. 注:派生类对象建立时要调用基类构造函数,派生类对象删除时要调用基类析构,顺序与构造函数严格相反. 2.例子 example 1 #include <iostream.h> #include <math.h> class Point { public: Point(double a, double b, doule c) { x = a; y = b; z = c; } double Getx() {re

别样JAVA学习(五)继承上

上章我们进行了面向对象的学习, 发现如果定义的几个类中的属性和方法重复, 代码是不是会显得很冗余啊?,有没有一种思想可以简化呢? 有!下面我们来看继承就能解决这个问题 1.继承-概述 继承: 1,提高了代码的复用性 2,让类与类之间产生了关系,也就是多态的特性 注意:千万不要为了获取其它类的功能,简化代码而继承 必须是类与类之间有所属关系才可以继承. Java语言中:java只支持单继承,不支持多继承 因为多继承容易带来安全隐患:当多个父类中定义了相同功能 且功能内容不同时,子类对象不确定运行哪

JavaWeb 后端 &lt;十四&gt; 文件上传下载

1.文件上传与下载 案例: 注册表单/保存商品等相关模块! --à 注册选择头像 / 商品图片 (数据库:存储图片路径 / 图片保存到服务器中指定的目录) 1.1 文件上传 文件上传,要点: 前台: 1. 提交方式:post 2. 表单中有文件上传的表单项: <input type=”file” /> 3. 指定表单类型: 默认类型:enctype="application/x-www-form-urlencoded" 文件上传类型:enctype =”multipart/

黑马程序员——JAVA学习笔记四(继承、接口、内部类)

1,    通过extends关键字让类与类之间产生继承关系.多个类中存在相同属性和行为时,将这些内容抽取到单独的一个类中,那么多个类无需定义这些属性和行为,只要继承那个类即可,已存在的类叫做超类,基类,或父类.新类称为子类,派生类,孩子类. 子类可以直接访问父类中的非私有的属性和行为.子类无法继承父类中私有的内容.JAVA不支持多继承,只支持单继承,多实现. 继承提高了代码复用性,让类与类之间产生了关系.为多态提供了前提. 2,    super关键字代表父类中成员变量内存空间的标示.两个作用

继承(上)

继承是面向对象编程中一个非常重要的特性,它也是另一个重要特性——多态的基础. 4.1继承概念的引入 现实生活中的事物都归属于一定的类别.比如,狮子是一种( IS_A)动物.为了在计 算机中摸拟这种关系,面向对象的语言引入了继承(inherit)的特性. 如图 所示,用类  Animal代表动物,用类  Lion代表狮子,用一个空心的三角箭头表 示继承关系. 构成继承关系的两个类中,Animal称为父类(parent  class)或基类(base  class),Lion 称为子类(child 

Linkit 7688 DUO(四): 接上各种Arduino传感器和模块——基础篇

前一篇讲了 Linkit 7688DUO操作Arduino的原理和基本方法.现在,我们要为开发板接上各类Arduino的传感器和模块了,这些模块提供了各类输入输出. 一.首先要充分了解 Linkit 7688 DUO开发板的引出管脚 Linkit 7688 DUO开发板上有两个处理器芯片. 一片是  Linkit 7688, 主处理器 一片是  ATmega32U4,  这是Arduino的处理芯片,提供Arduino编程接口,用于控制传感器外设等 两个处理器通过内部串口相连. 在开发中, 要写

2020年最全Spring面试题总结,“金三银四”戴上口罩不畏惧!

附上spring核心价值导图 ?1. 什么是 spring? Spring 是个java企业级应用的开源开发框架.Spring主要用来开发Java应用, 但是有些扩展是针对构建J2EE平台的web应用.Spring 框架目标是简化Java企 业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯. 2. 使用 Spring框架的好处是什么 ? 轻量:Spring 是轻量的,基本的版本大约2MB 控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是 创建或查找依赖

selenium python (十四)上传文件的处理

#!/usr/bin/python# -*- coding: utf-8 -*-__author__ = 'zuoanvip' #上传过程一般要打开一个系统的windows窗口,从窗口选择本地文件添加.所以一般会卡在如何操作本地window窗口.解决的方法很简单,只需要定位到上传按钮,然后通过send_keys添加本地文件路径即可from selenium import webdriverimport  osimport time driver = webdriver.Firefox() #打开

5.1-全栈Java笔记:面向对象的特征(一)继承 | 上

JAVA面向对象进阶 本章重点针对面向对象的三大特征:继承.封装.多态,进行详细的讲解.很多概念对于初学者来说,更多的是先进行语法性质的了解,不要期望,通过本章学习就"搞透面向对象".本章只是面向对象的起点,后面所有的章节说白了都是面向对象这一章的应用. 老鸟建议 建议大家,学习本章,莫停留!学完以后,迅速开展后面的章节.可以说这么说,以后所有的编程都是"面向对象"的应用而已! 继承(extend) 继承的实现 继承让我们更加容易实现类的扩展. 比如,我们定义了人类