【问题标题】:Can I define functions in a separate file and then include them in multiple cfc's to mimic multiple inheritance?我可以在单独的文件中定义函数,然后将它们包含在多个 cfc 中以模拟多重继承吗?
【发布时间】:2014-09-02 15:23:30
【问题描述】:

我问过previous question 关于coldfusion cfcs 中的多重继承。现在,我有一个问题,这是否可以模拟 cfcs 中的多重继承以及可能存在的缺点。

假设我有这 4 个类:Animal、Horse、Bird、Pegasus

  • Horse 和 Bird 是 Animal 的子类。
  • 飞马是马的一个子类。
  • 但是,Pegasus 的飞行方式与 Bird 实例的飞行方式相同 上课。

除了在 Bird 类和 Pegasus 类中定义相同的 fly() 两次之外,我可以在单独的文件中定义它并将其包含在 Pegasus 和 Bird 的 cfc 中吗?这样做有什么缺点吗?

马.cfc

    <cfcomponent extends="animal">
       <!--- misc functions run, eat, whinny... --->
    </cfcomponent>

bird.cfc

<cfcomponent extends="animal">
<cfinclude template="flier.cfm">
       <!--- misc functions hop, eat, chirp... --->
</cfcomponent>

pegasus.cfc

<cfcomponent extends="horse">
<cfinclude template="flier.cfm">
</cfcomponent>

flier.cfm

<cffunction name="fly">
<!--- flying action --->
</cffunction>

我已经尝试过这段代码,乍一看,它似乎适用于我想要完成的工作,但由于它不是我之前关于 CFC 中的多重继承问题的提到的解决方案,我想关于这是否是一个好方法的一些反馈。

【问题讨论】:

  • 好吧,你试过看看会发生什么吗?看起来您几乎已经设置了示例代码。尽管可能有充分的理由使用另一种设计模式,但我可以确认可以通过 include 混合 UDF。这些 UDF 应该存在于其目标 CFC 的上下文中,并共享它的变量和这个范围。一些框架这样做是为了轻松包含 UDF 库,而不依赖于继承或组合或编织 AOP 方面。
  • 嗯,是的,在我在另一个问题上给出(并且您接受)的答案中提到了它。第三段。这里不是你的确切方法,但同样的事情。
  • 对于这个特定的示例,将 fly() 函数放入 animal.cfc 似乎是实现目标的一种非常简单的方法。话虽如此,我曾经写过一个 .net 类库,其中我的功能必须可供多个类使用。我使用的方法是创建一个 HelperClasses 的项目。 CF 等效项是创建 cfc 并在您的其他 cfc 中创建对象。但是,这与您在问题中提到的使用 cfinclude 非常相似。
  • 我很抱歉,@Adam。我没有意识到这只是你所建议的一个例子。我仍在尝试掌握使用 cfcs 及其最佳实践的窍门。
  • 没有问题。如果您可以在编译时间之前定义混合要求(即:在您的源代码中),那么使用包含当然是一种简单的方法。无论如何,我的建议是更多地在运行时进行。

标签: oop inheritance coldfusion coldfusion-9 cfc


【解决方案1】:

是的,您所描述的将起作用,并且是一种由于各种原因而相对频繁使用的技术。

也就是说,当您在此处提出有关 SO 的问题时,在您询问它们是否可行之前,先尝试一下,尤其是如果它们很容易尝试,对您来说是最有利的。一般来说,当你来这里提问时,你应该把你的问题表述为:

  • 这是我的问题
  • 这是我试过的
  • 这是我收到的错误消息
  • 我做错了什么?

【讨论】:

  • 我很抱歉。我确实尝试过,到目前为止它似乎确实适用于我想要的东西。但是,由于没有人提到这是我之前选择的一个选项,我只是想知道这是否是一个实用的选项,或者我只是在给自己挖一个洞。我认为将其简单地附加到我的原始问题中是不正确的,因为我认为这是一个单独的问题。我编辑了我的问题以试图澄清。感谢您的意见。
【解决方案2】:

认为这是我刚刚发布的对您上一个问题的回复的延续。同样,WireBox 已经具有一些称为“运行时混合”的功能,类似于您所要求的功能。

http://wiki.coldbox.org/wiki/WireBox.cfm#Runtime_Mixins()

基本上,当您使用 WireBox 创建对象时,您可以在组件上指定一个注释到 UDF 文件中,该文件将作为公共方法添加。

// Via annotation
component mixins="/helpers/base"{

}

你可以有多个 mixin 文件,这模拟了多重继承。如果你不觉得它直接有用,你至少可以从它的实现中获得灵感。

完全披露:我是 Box 库的贡献成员。

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 2012-09-17
    • 1970-01-01
    • 2011-09-24
    • 2017-06-26
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多