多继承

接口的多继承

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-24 02:49:12
学习类的时候,知道类与类之间可以通过继承产生关系,接口和类之间可以通过实现产生关系,那么接口与接口之间会有什么关系。 多个接口之间可以使用extends进行继承。 interface Fu1{ void show(); } interface Fu2{ void show1(); } interface Fu3{ void show2(); } interface Zi extends Fu1,Fu2,Fu3{ void show3(); } 在开发中如果多个接口中存在相同方法,这时若有个类实现了这些接口,那么就要实现接口中的方法,由于接口中的方法是抽象方法,子类实现后也不会发生调用的不确定性。 问:Java中有多继承吗? 答:类没有多继承,接口之间有多继承 来源: CSDN 作者: little-stars 链接: https://blog.csdn.net/weixin_41874888/article/details/103998693

python多继承之先继先承

瘦欲@ 提交于 2020-01-24 00:27:32
class Base1 : def show ( self ) : print ( 'Base1.show' ) class Base2 : def show ( self ) : print ( 'Base2.show' ) class Foo ( Base1 , Base2 ) : pass obj = Foo ( ) obj . show ( ) 结果: Base1.show Base2.show 来源: CSDN 作者: ROOOOOOM 链接: https://blog.csdn.net/qq_41228218/article/details/104069147

python多继承的问题

亡梦爱人 提交于 2020-01-11 16:12:34
#type_1 class Base : def __init__ ( self ) : print ( "Base开始被调用" ) print ( "Base结束被调用" ) class Base_A : def __init__ ( self ) : print ( "Base_A开始被调用" ) print ( "Base_A结束被调用" ) class A ( Base ) : def __init__ ( self ) : print ( "A开始被调用" ) super ( ) . __init__ ( ) # 1 print ( 'A结束被调用' ) class B ( Base_A ) : def __init__ ( self ) : print ( "B开始被调用" ) super ( ) . __init__ ( ) # 2 print ( 'B结束被调用' ) class C ( A , B ) : #class C(B, A): def __init__ ( self ) : print ( "C开始被调用" ) #super().__init__() # 3 super ( ) . __init__ ( ) # 3 print ( 'C结束被调用' ) if __name__ == '__main__' : c = C ( ) type_1输出为:

单继承、多继承、菱形继承的虚函数表

自古美人都是妖i 提交于 2020-01-01 13:06:49
文章目录 前言 问题 测试环境 开始测试 无虚函数简单类结构 包含虚函数的类结构 单继承 多继承 菱形继承 虚继承 总结 前言 最近被问到一个关于多继承虚函数表的问题,当时回答是可能存在多个虚函数表,应该是顺序排列的,但具体怎么排列还是有些疑惑的,回答的时候到有点儿心虚。之后查了资料,做了简单的实验,可以确定的是对于继承了多个含有虚函数基类的子类来说,指向虚函数表的指针应该不止一个。 问题 虚函数表的问题是从C++多态的概念引出的,要想实现多态有3个条件: 存在继承:没有继承就没有多态(运行时),在多态中必须存在有继承关系的父类和子类。 重写函数:父类中需要定义带有 virtual 关键字的函数,而在子类中重写一个名字和参数与父类中定义完全相同的函数。 向上转型:将父类的指针和引用指向子类的对象。 满足以上三个条件,当使用父类的指针调用带有 virtual 关键字的函数时,就会产生多态行为。 实现这种多态表现的核心内容就是虚函数表,对于带有 virtual 关键字的函数地址会被放入一个表格,而在类中会有一个指向虚函数表的指针指向这个表格,表明这个表格属于类的一部分。 对于父类来说,这个表格中都是自己类的虚函数,而对于子类来说,首先这个虚函数表包含父类中所有的虚函数,当子类重写某个虚函数时就会用子类重写后的函数地址替换原来父类中定义的函数地址

python-面向对象之继承

喜夏-厌秋 提交于 2019-12-27 17:56:12
继承 什么是继承 继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为 基类 或 超类 ,新建的类称为 派生类 或 子类 python中类的继承分为:单继承和多继承 class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass 提示:如果没有指定基类,python的类会默认继承object类,object是所有python类的基类,它提供了一些常见方法(如 __str__ )的实现 >>> ParentClass1.__bases__ (<class 'object'>,) >>> ParentClass2.__bases__ (<class 'object'>,) 抽象与继承(先抽象再继承) 抽象即抽取类似或者说比较像的部分。 抽象分成两个层次: 将奥巴马和梅西这俩对象比较像的部分抽取成类; 将人,猪,狗这三个类比较像的部分抽取成父类。 抽象最主要的作用是划分类别(可以隔离关注点,降低复杂度) 继承

C++对象模型:单继承,多继承,虚继承

泄露秘密 提交于 2019-12-24 14:13:08
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 什么是对象模型 有两个概念可以解释C++对象模型: 语言中直接支持面向对象程序设计的部分。 对于各种支持的底层实现机制。 类中成员分类 数据成员分为静态和非静态,成员函数有静态非静态以及虚函数 class data members:static和nonstatic class data functions:static、nonstatic和virtual 比如: class Base { public: Base(int i) :baseI(i){}; int getI(){ return baseI; } static void countI(){}; virtual void print(void){ cout << "Base::print()"; } virtual ~Base(){} private: int baseI; static int baseS; }; 对象模型分类 简单对象模型 :这个模型非常地简单粗暴。在该模型下,对象由一系列的指针组成,每一个指针都指向一个数据成员或成员函数,也即是说,每个数据成员和成员函数在类中所占的大小是相同的,都为一个指针的大小。这样有个好处——很容易算出对象的大小,不过赔上的是空间和执行期效率。所以这种对象模型并没有被用于实际产品上。 表格驱动对象模型

python super()

放肆的年华 提交于 2019-12-21 14:12:51
python super() 转自:http://www.cnblogs.com/lovemo1314/archive/2011/05/03/2035005.html 一、问题的发现与提出   在Python类的方法(method)中,要调用父类的某个方法,在Python 2.2以前,通常的写法如代码段1: 代码段1: class A: def __init__(self): print "enter A" print "leave A" class B(A): def __init__(self): print "enter B" A.__init__(self) print "leave B" >>> b = B() enter B enter A leave A leave B 即,使用非绑定的类方法(用类名来引用的方法),并在参数列表中,引入待绑定的对象(self),从而达到调用父类的目的。   这样做的缺点是,当一个子类的父类发生变化时(如类B的父类由A变为C时),必须遍历整个类定义,把所有的通过非绑定的方法的类名全部替换过来,例如代码段2, 代码段2: class B(C): # A --> C def __init__(self): print "enter B" C.__init__(self) # A --> C print "leave B"   如果代码简单

继承的使用方法,多继承的问题,组合,菱形继承的概念,接口,接口与抽象,鸭子类型,

邮差的信 提交于 2019-12-20 08:14:19
1.继承的另一种使用方法 2.多继承的问题 3.组合 4.菱形继承的概念 5.接口 6.接口与抽象 7.鸭子类型 1. 继承的另一种使用方式 最常见的是直接继承一个已经存在的类,当你想要创建一个新类,发现这个类中的一些属性方法,再某一个类中已经存在 那就没有必要从头开始写,可以直接继承已有的类,然后补充 ''' 实现一个存储类 在提供基本的存取功能之外 还要可以限制存储元素的类型 ''' class MyList(list): def __init__(self, element_cls): # 当你覆盖了init方法时, # 不要忘记调用super().init函数让父类完成原有的初始化操作 super().__init__() self.element_cls = element_cls def append(self, object): # if isinstance(object,str) if object.__class__ == self.element_cls: super().append(object) else: print('只能存储%s类型' % self.element_cls.__name__) li = MyList(str) li.append(10) li.append('123') print(li) 2. super()的问题,mro列表

python3的多继承问题

我怕爱的太早我们不能终老 提交于 2019-12-17 19:02:36
#在Python的多继承中,如果子类继承的多个父类中包含了同名的方法,子类在调用时会选择哪个 class Item : def info (self): print("Item中的方法","这是一个商品") class Product: def info(self): print("Product中的方法" , "这是一个工业产品") class Mouse(Item, Product): pass m = Mouse() m.info() 输出: Item中的方法,这是一个商品 class Item : def info (self): print("Item中的方法","这是一个商品") class Product: def info(self): print("Product中的方法" , "这是一个工业产品") class Mouse(Product, Item): pass m = Mouse() m.info() 输出: Product中的方法 这是一个工业产品 总结: 可见多继承中,父类有同名方法,子类在调用时会选择继承中排在前面的父类方法 拓展: 如果子类也包含同名方法,子类调用同名方法,优先选择自己的方法,这叫做重写,也叫覆盖override class Item : def info (self): print("Item中的方法","这是一个商品")

Objective-C中实现“多继承”

╄→гoц情女王★ 提交于 2019-12-10 11:14:20
当单继承不够用,很难为问题域建模时,我们通常都会直接想到多继承。多继承是从多余一个直接基类派生类的能力,可以更加直接地为应用程序建模。但是Objective-C不支持多继承,由于消息机制名字查找发生在运行时而非编译时,很难解决多个基类可能导致的二义性问题。不过其实 Objective-C 也无需支持多继承,我们可以找到如下几种间接实现多继承目的的方法: 1)消息转发 2)delegate和protocol 3)类别 1、利用消息转发实现见本人另一篇博客 http://my.oschina.net/Jacedy/blog/625343 ; 2、 委托是Objective-C中最常用的一种回调机制,没什么好说的; 3、 类别是个强大的东西,它可以为类添加方法,虽然它不能直接为类添加属性,但可以使用 runtime 中的objc_setAssociatedObject 和 objc_getAssociatedObject 方法间接为类添加属性。 Person类为一新建的空类,现在利用类别为Person类添加 (nonatomic, copy) NSString *addr 属性: // Person+Teacher.h #import "Person.h" @interface Person (Teacher) - (void)setAddr:(NSString *)addr; -