当前位置:  开发笔记 > 开发工具 > 正文

用于多重继承?

如何解决《用于多重继承?》经验,为你挑选了2个好方法。

谁能想到使用多重继承的任何情况?我能想到的每个案例都可以通过方法运算符来解决

AnotherClass() { return this->something.anotherClass; }

Erik Funkenb.. 29

大规模多重继承的大多数用途是针对mixins.举个例子:

class DraggableWindow : Window, Draggable { }
class SkinnableWindow : Window, Skinnable { }
class DraggableSkinnableWindow : Window, Draggable, Skinnable { }

等等...

在大多数情况下,最好使用多重继承来严格执行接口继承.

class DraggableWindow : Window, IDraggable { }

然后在DraggableWindow类中实现IDraggable接口.编写好的mixin课程太难了.

MI方法的好处(即使您只使用接口MI)是您可以将各种不同的Windows视为Window对象,但可以灵活地创建单个不可能(或更难)的东西遗产.

例如,在许多类框架中,您会看到如下内容:

class Control { }
class Window : Control { }
class Textbox : Control { }

现在,假设您想要一个具有Window特征的文本框?就像可拖动,有标题栏等...你可以做这样的事情:

class WindowedTextbox : Control, IWindow, ITexbox { }

在单继承模型中,您不能轻易地从Window和Textbox继承而不会出现重复Control对象和其他类型问题的问题.您还可以将WindowedTextbox视为Window,Textbox或Control.

另外,为了解决.anotherClass()习惯用法,.anotherClass()返回一个不同的对象,而多重继承允许同一个对象用于不同的目的.



1> Erik Funkenb..:

大规模多重继承的大多数用途是针对mixins.举个例子:

class DraggableWindow : Window, Draggable { }
class SkinnableWindow : Window, Skinnable { }
class DraggableSkinnableWindow : Window, Draggable, Skinnable { }

等等...

在大多数情况下,最好使用多重继承来严格执行接口继承.

class DraggableWindow : Window, IDraggable { }

然后在DraggableWindow类中实现IDraggable接口.编写好的mixin课程太难了.

MI方法的好处(即使您只使用接口MI)是您可以将各种不同的Windows视为Window对象,但可以灵活地创建单个不可能(或更难)的东西遗产.

例如,在许多类框架中,您会看到如下内容:

class Control { }
class Window : Control { }
class Textbox : Control { }

现在,假设您想要一个具有Window特征的文本框?就像可拖动,有标题栏等...你可以做这样的事情:

class WindowedTextbox : Control, IWindow, ITexbox { }

在单继承模型中,您不能轻易地从Window和Textbox继承而不会出现重复Control对象和其他类型问题的问题.您还可以将WindowedTextbox视为Window,Textbox或Control.

另外,为了解决.anotherClass()习惯用法,.anotherClass()返回一个不同的对象,而多重继承允许同一个对象用于不同的目的.



2> LeopardSkinP..:

我发现使用mixin类时多重继承特别有用.

如维基百科所述:

在面向对象的编程语言中,mixin是一个提供某个子类继承的功能的类,但并不意味着独立.

我们的产品如何使用mixin类的一个示例是配置保存和恢复目的.有一个抽象的mixin类,它定义了一组纯虚方法.任何可保存的类都继承自save/restore mixin类,它自动为它们提供适当的保存/恢复功能.

但是它们也可以从其他类继承作为它们正常类结构的一部分,因此这些类在这方面使用多重继承是很常见的.

多重继承的一个例子:

class Animal
{
   virtual void KeepCool() const = 0;
}

class Vertebrate
{
   virtual void BendSpine() { };
}


class Dog : public Animal, public Vertebrate
{
   void KeepCool() { Pant(); }
}

做任何形式的公共继承时,什么是最重要的(一个或多个)是尊重是一个关系.如果一个类"是"其中一个对象,那么它应该只从一个或多个类继承.如果它只是"包含"其中一个对象,则应使用聚合或组合.

上面的例子结构合理,因为狗是动物,也是脊椎动物.


像这样的更好的例子是FlyingCreature作为mixin.大多数鸟类和一些哺乳动物(蝙蝠)将继承FlyingCreature以及Bird或哺乳动物基类.类似地,对于其他属性,这会影响跨越通常分类法的行为.
推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有