2016-12-02 62 views
0

假设我需要一组类实现所有方法 X,Y和Z才能正常工作。在这种情况下,我可以让他们实施一个通用界面来强制这一点。强制类实现一组方法之一

现在,我的情况有点不同 - 我的课程需要实现至少有一个 X,Y和Z,不一定全部。接口在这里帮不了我。我能想到的最接近的是一个共同的父母 - 它可以检查X,Y或Z在其结构中的存在。

我宁愿避免在这里继承,因为我可能需要在已经有一个父类的类中实现这个“接口”。所以 - 是否有另一种优雅的方式来做到这一点?

(我在PHP中的工作,但如果一般的OOP的解决方案存在,它可用于更广泛的受众。)

+0

接口可以帮助你。这些接口扩展了一个通用接口。不知道你希望如何继承,除非你想每次检查它是哪一个。 –

+3

听起来像一个糟糕的建筑/设计。你能解释一下为什么你需要“实现X,Y,Z中的至少一个”吗? –

+0

@WaxCage我们有配置值访问类。有些可以从数据库中获取它们,另一些从配置文件中获取,另一些则可以从硬编码数组中获取。你可以通过getAsString(),getAsParamObject()或类似的方法从这样的类中获得一个值。 这绝对是一个糟糕的设计,但这是我现在需要处理的一个设计。 这些配置类经常被修改(和破坏),所以我想在重构整个事物之前确保它们的基本功能(至少以某种方式获取值)。 –

回答

1

我宁愿避免遗产在这里,因为我可能需要实现这个“接口“在已经有一个父类的类中。所以 - 是否有另一种优雅的方式来做到这一点?

如果我理解正确的话,你可以解决这个问题,通过Traits

trait DefaultImpl 
{ 
    public function x() 
    { 
     echo "Default implementation of x()\n"; 
    } 

    public function y() 
    { 
     echo "Default implementation of y()\n"; 
    } 

    public function z() 
    { 
     echo "Default implementation of z()\n"; 
    } 
} 

class XImpl 
{ 
    use DefaultImpl; 

    public function x() 
    { 
     echo "Custom implementation of X\n"; 
    } 
} 

$x = new XImpl(); 
$x->x(); 
$x->y(); 
$x->z(); 

这不是从设计的角度来看一个非常好的解决方案。但它比不必要的继承更好。

相关问题