Oop Coldfusion组件可以共享方法而不是同一个超类的后代吗

Oop Coldfusion组件可以共享方法而不是同一个超类的后代吗,oop,coldfusion,multiple-inheritance,coldfusion-9,cfc,Oop,Coldfusion,Multiple Inheritance,Coldfusion 9,Cfc,我们已经使用了一段时间的面向对象的coldfusion的自制版本,我刚刚开始试验cfc,以及它“应该”是如何实现的 如果我理解正确,cfinterface定义了函数的签名,实现该接口的任何类都必须有自己的函数来执行接口中定义的操作 我正试图做相反的事情——接口不仅定义函数的签名,还定义函数的逻辑,实现该接口的任何东西都可以使用它的函数,而不必定义它自己。除了创建子类之外,还存在这样的问题吗 例如,假设你有A、B、C、D类,它们都属于动物类 A&B可以走路 A&C会说话 B&D可以睡觉 假设wa

我们已经使用了一段时间的面向对象的coldfusion的自制版本,我刚刚开始试验cfc,以及它“应该”是如何实现的

如果我理解正确,cfinterface定义了函数的签名,实现该接口的任何类都必须有自己的函数来执行接口中定义的操作

我正试图做相反的事情——接口不仅定义函数的签名,还定义函数的逻辑,实现该接口的任何东西都可以使用它的函数,而不必定义它自己。除了创建子类之外,还存在这样的问题吗

例如,假设你有A、B、C、D类,它们都属于动物类

  • A&B可以走路
  • A&C会说话
  • B&D可以睡觉
  • 假设walk、talk和sleep的逻辑(如果对象能够做到的话)是相同的,不管是哪个类做的
  • 理想情况下,如果A和B都实现了walking接口,那么它们就可以进行walking,而无需在每个类中定义单独的walk方法
或者从中借用一个更好的例子

  • 飞马座是马和鸟的混合体,因为它像马一样奔跑 但是像鸟一样飞

可能吗?(我认为这是多重继承?

简言之:不,接口只定义一个契约,它不(也不能)定义功能)。而且CFML没有多重继承的概念

您必须使用单一继承和具体实现来实现所需的功能。我不必费心评估您的实现共享需求,以确定合适的类层次结构可能是什么,从而最大限度地减少代码重复。我相信你自己能做到(无论如何,这不是你问题的一部分)

您可以尝试的一种策略是在常用方法中使用mixin。将常用方法存储在不同的库中,然后根据需要将它们注入到对象中。因此,基本上Mixins.cfc将实现
walk()
talk()
sleep()
,您将拥有一个
AFactory.cfc
BFactory.cfc
CFactory.cfc
。当要求工厂提供新的
a
B
C
时,工厂方法会在返回实例之前注入mixin方法。显然,这是一个相当麻烦的过程,您可能希望使用某种IoC容器来管理所有这些


一个更好的问题可能来自你给我们展示更多的真实世界的例子。。。我怀疑,如果您发现自己需要按照示例中的建议去做,那么您的域设计可能会经得起改进。实际的设计要求很少在使用动物的示例中公开。

您可以使用WireBox及其虚拟继承功能执行类似的操作:

这基本上与亚当所描述的非常相似;创建基类,并将对其公共成员的引用放置在子类中。

没有理由不能构建类似的东西,但是你应该知道这已经完成了


完全公开,我是*Box社区的一名贡献者

此问题讨论Java中的多重继承:。你可能会发现它很有用。是的,这就是我试图做的,这是一个更好的例子!那么,现在如何在CF中实现呢?就我个人而言,我可能会使用组合来实现这一点(如上面问题的第二个和第三个答案所述)。另一种选择是拥有一个可以行走、交谈和睡眠的超类,然后覆盖扩展类中不相关的方法以抛出异常,但这对我来说有一种非常糟糕的代码味道。@SeanWalsh我非常同意你的观点。
// Declare base CFC
map("BaseModel").to("model.base.BaseModel");

map("UserService").to("model.users.UserService").virtualInheritance("BaseModel");