问题标签 [multiple-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
565 浏览

c++ - 将接口“ISingleton”抽象为基类

我有 3 个接口类IVideo , IAudio , IGPIO和其他三个将实现这些接口的类:Video_impl , Audio_impl , GPIO_impl.

到目前为止,事情很简单。

但是,我希望所有这些对象都是单例的。以下是问题:

抽象一个 Interface 是个好主意ISingleton,以便Video_impl , Audio_impl , GPIO_impl(或IVideo , IAudio , IGPIO?)可以继承它?

我正在考虑以下列方式实现它。推荐吗?我认为必须有更好的方法。

0 投票
1 回答
1763 浏览

php - 魔术函数和继承

我想知道是否可以创建一个扩展另一个魔术对象的魔术对象(使用 PHP)。

0 投票
5 回答
1182 浏览

c# - 我怎样才能排除这里的代码重复?

所以,我想听听大家对此的看法。

我有一个项目,其中三个不同的继承路径都需要实现另一个基类。这将是多重继承,并且在 C# 中是不允许的。我很好奇如何在不重复代码的情况下实现这一点。

编辑:我不拥有这三个班级。这三个类来自 3rd 方代码。所以我不能让它们都扩展我的基类。

现在我正在使用三个不同的类,每个类都扩展了一个不同的基类。然后我在三个抽象类中的每一个中都有相同的代码。

我可以使用单个界面,但我仍然需要复制代码。

我可以制作某种实现代码的静态类,然后在 3 个抽象类中的每一个中引用它。它会消除重复,但是,我不确定我对此有何感受。我可以在接口上实现扩展方法,但是接口本身会是空的,并且扩展方法(包含重复的代码)会在一个完全不同的文件中,这似乎不太正确。另外我不能在扩展方法中实现属性......

我怎样才能排除这里的代码重复?

编辑,继承树:

我有我想在上述每个类中的代码,但我不能将它添加到 3rdPartyClasses。

0 投票
3 回答
175 浏览

php - php,如何制作父对象

我想知道无论如何我可以用php创建一个父对象,我试过这个:

但它不起作用,我在 php 日志中收到以下错误:

(..)PHP 解析错误:语法错误,意外的 T_STRING,期待 T_VARIABLE 或 '$'(..)

0 投票
2 回答
535 浏览

nhibernate - 存储多个继承类的数据库结构

我有两个不同的(无继承)接口:
IInvestableIPricable
两个类: 它们存储在我的数据库中的单独表中
IndexClassFundClass

IndexClassIPriceable
FundClassIPriceableIInvestable

我需要一张表来存储价格,IndexClassFundClass
我需要一张表来存储FundClasses投资的价格。

一种方法可能是有两个表:Pricable其中Investable只有一个 ID 列。
然后在 : 上有一个外键 在 :IndexClass和.上PricableID
也有两个外键。FundClassPricableIDInvestableID

然后我的价格简单地链接到PricableID,我的投资简单地链接到,InvestmentID因为这些都是独一无二的。

或者,我可以在 Price 表上有FundClassIDIndexClassID,但这似乎不可扩展,并且似乎很难使用。

然后让 NHibernate 弄清楚——我仍然不能 100% 确定它会喜欢它!

我在互联网上真的找不到任何关于存储多重继承的建议,我想知道是否有人对此有任何想法,或者他们过去是否解决过类似的问题?

谢谢

斯图

0 投票
3 回答
360 浏览

.net - 可以是单独的或组合的域实体的继承/设计问题

我完全困惑自己试图设计必要的接口和抽象来完成可以自己使用以及组合成聚合的域实体的加载。哇。那是一个满口的流行语。本质上,我有两个对象,我希望它们具有基本类型的“加载”功能,但是当这两个对象合并为一个时,我会遇到多重继承。

所以,我有我的实体,就像这样(我会画

然后,我有接口,如下所示:

由于 Account 和 Document 都可以(并且正在)从其他实体派生,我想在实现中提供基本功能,以便我遵循 DRY。

这适用于单个 Account 和 Document 对象及其派生,但我似乎无法解决的问题是如何处理 AccountDocument ...

我知道解决方案不会那么难,但我完全纠结,无法理清如何只提供一次基本的“加载”功能。请帮忙!

提前致谢。

0 投票
1 回答
10189 浏览

java - 如何在 Java 中要求方法参数来实现多个接口?

在 Java 中这样做是合法的:

我该怎么做(语法不合法):

如果可能的话,我希望强制调用者使用可附加和可关闭的对象,而不需要特定的类型。有多个标准类可以做到这一点,例如 BufferedWriter、PrintStream 等。

如果我定义自己的界面

这是行不通的,因为实现 Appendable 和 Closeable 的标准类没有实现我的接口 AppendableAndCloseable (除非我不像我认为的那样理解 Java……空接口仍然在它们的超级接口之上和之外添加唯一性)。

我能想到的最接近的是执行以下操作之一:

  1. 选择一个接口(例如 Appendable),并使用运行时测试来确保参数是instanceof其他接口。缺点:在编译时没有发现问题。

  2. 需要多个参数(捕获编译时正确性但看起来很笨拙):

    /li>
0 投票
6 回答
1426 浏览

c++ - C++中的多重继承困境

我在设计我的 C++ 库时遇到了问题。它是一个用于读取流的库,支持我在其他“流”实现中没有找到的功能。为什么我决定开始写它并不重要。关键是我有一个流类,它通过多重继承提供两个重要的行为:可共享性和可搜索性。

可共享流是具有 shareBlock(size_t length) 方法的流,该方法返回与其父流共享资源的新流(例如,使用父流使用的相同内存块)。可搜索的流是那些......好吧,可搜索的。通过方法 seek(),这些类可以搜索到流中的给定点。并非库的所有流都是可共享和/或可搜索的。

一个同时提供资源查找和共享实现的流类继承了称为 Seekable 和 Shareable 的接口类。如果我知道这样一个流的类型,那就太好了,但是,有时,我可能希望一个函数接受一个流作为参数,该流只满足同时可搜索和可共享的质量,而不管它实际上是哪个流类是。我可以这样做创建另一个继承 Seekable 和 Shareable 的类并引用该类型,但是我必须使我的类既可查找又可共享的类继承自该类。如果要添加更多类似的“行为类”,我将需要在代码的各处进行一些修改,很快就会导致无法维护的代码。有没有办法解决这个困境?如果没有,那我 我完全理解为什么人们对多重继承不满意。它几乎完成了这项工作,但是,就在那时,它没有:D

任何帮助表示赞赏。

-- 第二次编辑,首选问题解决方案 --

起初我认为Managu 的解决方案是我的首选。然而,Matthieu M.带来了另一个我比 Managu 更喜欢的:使用boost::enable_if<>. BOOST_MPL_ASSERT如果生成的消息不是那么令人毛骨悚然,我想使用 Managu 的解决方案。如果有任何方法可以创建有启发性的编译时错误消息,我肯定会这样做。但是,正如我所说,可用的方法会产生令人毛骨悚然的信息。boost::enable_if<>因此,我更喜欢在不满足条件时产生的(更)指导性较低但更清晰的信息。

我创建了一些宏来简化编写模板函数的任务,这些模板函数接受继承选择类类型的参数,它们在这里:

如您所见,错误消息非常干净(至少在 GCC 3.4.5 中)。但它们可能具有误导性。它不会通知您您传递了错误的参数类型。它通知您该功能不存在(事实上,它不是由于 SFINAE;但这可能对用户来说并不完全清楚)。尽管如此,我更喜欢那些干净的信息而不是那些randomStuff ... ************** garbage ************** BOOST_MPL_ASSERT产品。

如果您在此代码中发现任何错误,请编辑并更正它们,或在这方面发表评论。我在这些宏中发现的一个主要问题是它们仅限于某些 Boost.Preprocessor 限制。例如,在这里,我只能将DerivationsArray最多 4 个项目的 a 传递给SONETTO_ENABLE_IF_DERIVED(). 我认为这些限制是可配置的,也许它们甚至会在即将到来的 C++1x 标准中被取消,不是吗?如果我错了,请纠正我。我不记得他们是否建议对预处理器进行更改。

谢谢你。

0 投票
1 回答
4654 浏览

c++ - 访问虚拟派生类的成员/方法

这里的例子没有意义,但这基本上是我用 Python 编写程序的方式,我现在用 C++ 重写它。我仍在尝试掌握 C++ 中的多重继承,我需要做的是从 main 通过 C 的实例访问 A::a_print。下面你会看到我在说什么。这可能吗?

这是编译错误。

0 投票
4 回答
1538 浏览

c++ - C++ ptrs 到 ptrs 的抽象基类数组

我有一个抽象基类(Comparable),它实际上继承了日期和时间,还有一个继承自日期和时间的 DateTime 类。

我的问题是:我的任务是动态分配一个 Comparables 数组。

然后我以交替的顺序用 DateTimes 填充数组。我需要使用快速排序和冒泡排序组合对这个数组进行排序。如果长度 < 8 则为气泡。Comparable** from 和 Comparable ** to 是我被允许使用的唯一参数。

但我完全被困住了。在这一点上,它不值得粘贴在我的代码中,因为它非常随意。

任何帮助将不胜感激。我花了过去几个小时试图完成这个,我的项目中只剩下排序。明天上午晚些时候到期。

在此先感谢,乔尔

编辑:

我得到了上面的用作我的arraySort.h

我正在使用:int aSize = _msize(a) / sizeof(Comparable) - 1;作为我的长度变量......我必须计算而不是传递它,这有点烦人。

我主要只是对取消引用 ** 并在快速排序中调用它的 lessThan 或 equals 方法感到头疼。一旦我了解如何使用它进行快速排序,我就会“点击”,我就可以轻松地进行冒泡排序。

编辑:我目前有以下作为我的冒泡排序,它根本不对数组进行排序。