2016-12-17 28 views
1

对于这个问题,我想介绍一下我目前的设计和使用特质的想法。我想知道我对特质的理解是否正确,以及我的问题是否可以用不涉及他们的另一种设计来解决。使用PHP特性来模拟多重继承

在我的框架我目前的类层次结构是这样的:

interface IPage { /* ... */ } 
interface IForm extends IPage { /* ... */ } 
abstract class AbstractPage implements IPage { /* ... */ } 
abstract class AbstractForm extends AbstractPage implements IForm { /* ... */ } 

在我的应用程序是基于我曾经有过如下的框架:

abstract class AbstractBasePage extends AbstractPage { /* ... */ } 

因此我可以添加一些此框架或其他应用程序不常见的此特定应用程序的所有页面的更多内容。这一直很好地工作,直到我按照第一个代码片段的指示实现了页面和表单的分离。现在,我结束了这样的事情:

abstract class AbstractBasePage extends AbstractPage { /* ... */ } 
abstract class AbstractBaseForm extends AbstractForm { /* ... */ } 

让我们在一个应用中承担应有的每一页和形式,它指出一些特别的东西是否显示在模板中的变量。我需要在AbstractBasePageAbstractBaseForm中引入相同的变量。这样做会迫使我将这两个片段保持同步,这并不是很好。

我正在考虑创建一个将变量和函数公开给这两个类的特征,他们可以在相应的函数中引用它们。至少可以使用这种特性来减少代码重复,因为我可以引入一个可以被两个类调用的公共访问方法,但除了有一个体面的抽象外,不是吗?

这是什么特质应该帮助?有更合适的方法吗?

回答

1

在这个特殊情况下,我最终引入了一个接口(带有由框架使用的函数)作为合约,该合约被IPage扩展。此外,我对特定的页面和表单中的特定实现进行了处理,然后在框架类AbstractPageAbstractForm中使用。

提到的实现是在框架本身内部有一个简洁的设计,然后在我的应用程序中使用它。对于应用程序,我引入了一个特征,它在两个页面和表单中再次保存相同的变量和函数,然后在AbstractBasePageAbstractBaseForm类中使用。

对于这种情况,我需要一个本质上是语言辅助的复制和粘贴功能,因为我想添加一些不太容易用继承完成的事情,但是可以引入到属于不同类的一部分的类中层次结构。所以我决定使用特质。