类A继承类B,类C继承类A,那类C是否同时有类A和类B的方法和属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了类A继承类B,类C继承类A,那类C是否同时有类A和类B的方法和属性相关的知识,希望对你有一定的参考价值。

  类A继承类B,类C继承类A,那类C是不是同时有类A和类B的方法和属性,这个不能一概而论,要看A和B中的限定符,如:private,public protected,如果是public的话那就是C继承了A的方法和属性,如果是private则没有继承,如果是protected则C只有A的protected属性和方法(以上针对C++而言)。

  Public 语句声明的变量在所有应用程序的所有没有使用OptionPrivate Module 的模块的任何过程中都是可用的;若该模块使用了 OptionPrivate Module,则该变量只是在其所属工程中是公用的。
  小心 不能在类模块中使用Public 语句来声明一个定长的字符串变量。
  使用Public 语句可以声明变量的数据类型。例如,下面的语句声明了一个 Integer 类型的变量。
  Public NumberOfEmployees As Integer 也可以使用Public 语句来声明变量的对象类型。下面的语句为工作表的新实例声明了一个变量。
  Public X As New Worksheet 如果在定义对象变量时没有使用New 关键字,则在使用该变量之前,必须使用 Set 语句将一个已有的对象赋给这个引用对象的变量。在被赋值之前,所声明的这个对象变量有一个特定值 Nothing,这个值表示该变量没有指向任何对象的实例。
  可以用带空圆括号的Public 语句来声明动态数组。在声明了动态数组之后,可以在过程内用 ReDim 语句来定义该数组的维数和元素。如果试图在 Private、Public 或 Dim 语句中重定义一个已被显式定义了大小的数组的维数,就会发生错误。
  如果不指定数据类型或对象类型,且在模块中没有使用Deftype 语句,则按缺省情况该变量为 Variant 类型。
  当初始化变量时,数值变量被初始化为 0,变长的字符串被初始化为一个零长度的字符串 (""),而定长的字符串则用 0 填充。Variant 变量被初始化为 Empty。用户自定义类型的变量的每个元素都作为各自独立的变量进行初始化。
  
参考技术A 这个不能一概而论,要看A和B中的限定符,如:private,public protected,如果是public的话那就是C继承了A的方法和属性,如果是private则没有继承,如果是protected则C只有A的protected属性和方法(以上针对C++而言)本回答被提问者和网友采纳

面向对象2

类的继承

一个类可以继承另外一个类的属性跟方法

PHP中类的继承只有单继承,没有多继承,也就是一个类只能继承一个类,而不能继承多个类

但是,我们可以通过一些方法让一个类继承多个,比如:类b继承类a,类C再去继承类b的话不就同时继承了类a跟类b

继承需要用到一个关键字

extend

语法:

Class 类名 extends 被继承的类名{}

继承的本质:继承不是将父类复制到子类,而是通过继承链条的形式,先到子类找,如果找不到就会到父类找!

重写override

含义:当子类的成员的名字与父类的成员相同,那么在访问子类的时候,子类会将父类的成员覆盖,也就是跟前面说到的继承链条的形式,先找子,再找父,先找到谁就用谁

一个面试题:

 

$this永远代表所在类的对象吗?

 

不是!

 

$this究竟代表哪个类的对象,不是由$this的代码写在哪个类决定的,而是根据当前方法的执行环境决定的,执行环境也叫执行上下文,执行上下文是可以向上或者向下传递的!

访问控制修饰符

访问控制修饰符有三个

public公共的,当前类内,继承链类内和类外都可以被访问到!

protected受保护的,当前类内和继承链类内可以被访问,但是类外不能访问!

private私有的,只有当前类内可以被访问到!

一般在项目内类里面的成员会尽量的隐蔽,也就是私有,然后再开放出几个公共的端口方法,让用户访问

如果父类有私有成员的话,子类能够继承,但是不能直接访问

final 最终类

值的是这样的类智能实例化,而不能被继承,但是可以继承别人

语法:在class前加上final

最终方法final method

在一个方法名的前面加上final关键字之后,就变成了最终方法!

 

最终类的意思是该类不能被继承,最终方法的意思是该类不能被重写!

 

所以,最终方法的意义是当该类被继承的时候,父类里面的最终方法不能被重写!

abstract抽象类

含义:只能被其他类继承,不能实例化

抽象类的作用

1, 可以完成普通类的继承,为其他的类提供了公共的代码!

2, 用于规定子类中必须要出现的方法成员,规定子类的结构,在真实的项目中,往往是保证完成一系列功能相似的多种操作类的结构保持一致!我们要求这些功能相似的类都继承自同一个抽象类!

3, 子类必须要有抽象类的属性跟方法,不然就会报错

interface接口

接口就是一个对象对外的公共的操作方法!

 

对象的封装性:对象把里面的定义代码尽量隐藏起来,用户不需要知道里面的功能是如何实现的,用户只需要操作这个类提供的接口方法就行了!

 

PHP中定义一个接口,其实就是一种纯粹的规范或规定,用来规定该接口的子类必须要实现的公共的方法!

 

在接口中只能出现两种成员:

接口常量:其实就是普通类常量,不过是出现在接口中而已!

抽象方法:必须声明为public(与抽象类不同,抽象类可以定义所有类型的成员)

抽象方法不需要用到abstract关键字,因为interface接口其实不算类,里面的方法默认是抽象方法!

只要是继承它的子类,都必须要它的要求声明常量跟创造方法

接口与抽象类的比较

1, 从逻辑结构上来看,接口可以看成是抽象类的一个“子集”;都可以规定下级类的内部结构,只是接口里面只能有接口常量和公共抽象方法!

2, PHP不支持多继承,但是支持多实现,也就是说,一个类可以同时实现多个接口!这也是接口与抽象类的最本质的区别!

在真实的项目中,用接口使用的多一些!

overload重载简介

指的是对不可访问的成员的处理,称之为成员的重载!

也就是说,为一个不存在的属性赋值的时候,PHP默认的是支持该属性重新加载到当前对象的内部成员中,这种现象就是属性的“重载”!

 

其实,PHP对访问不可访问的成员,是可以采取相应的操作进行处理的!

根据所处理的成员的不同,重载又可以分成:属性重载和方法重载!

属性重载

系统有几个魔术方法是关于属性重载的

一共有四个,分别处理属性操作的4种情况:

当为一个不可访问的属性进行赋值的时候:   __set()

当获取一个不可访问的属性的值的时候:__get()

当删除一个不可访问的属性的时候:__unset()

当判断一个不可访问的属性是否存在的时候:__isset()

__set(类名,值)

__get(类名)

__unset(类名)

__isset(类名)

方法的重载

__call()

当调用一个不可访问的非静态方法(对象方法)的时候,会自动执行该魔术方法!

 

系统默认的行为是报错:

需要两个参数

String 方法名,字符串型,需要加上引号

Array  参数数组 所访问的方法的参数数组

__callstatic()

触发时机:当访问一个不可访问的静态方法的时候,会自动执行该方法!注意:需要在该方法的前面加上static关键字!因为,当访问的静态方法不存在的时候,也应该由类来访问这个魔术方法,所以需要加上static关键字!

 

需要的参数跟__call一样

魔术方法和相关的魔术常量

魔术方法

__invoke()

触发时机:当把对象当做一个函数或方法来调用的时候,会自动执行该魔术方法!目前用的不是太多!

 

 

__toString()

触发时机:将一个对象当做一个字符串来使用的时候,会自动触发该方法!

魔术常量

__CLASS__

代表当前类名

__METHOD__

代表当前的方法名!

__NAMESPACE__:代表当前命名空间名!

后期静态绑定

总结一下static的关键字的作用:

 

1, 在定义局部变量的时候可以使用,成为静态局部变量,和变量的生命周期有关

2, 在类中定义静态成员的时候,代表的含义是指该成员属于所有的对象所共享的成员,应该由类进行管理

3, 代表“当前类”!

以上是关于类A继承类B,类C继承类A,那类C是否同时有类A和类B的方法和属性的主要内容,如果未能解决你的问题,请参考以下文章

C++中什么是菱形继承,怎么解决?

Java中接口是否可以继承多个接口?

继承和多态

C++多态

[Python]-8-对象与类(下)

接口可以继承多个接口总结