虽然这个问题是关于解决这个问题的方法,但我对良好的干净OO设计和符合当前PHP最佳实践的解决方案特别感兴趣。提前感谢您的光临。
我有以下接口:
<?php
interface Tool {
/**
* Return the unique name of the tool
*/
public function getName();
}
在我的项目中实现这个接口的大多数类看起来是这样的:
<?php
class Drill implements Tool {
protected $toolName = 'drill';
public function getName() {
return $this->toolName;
}
}
因此问题是我有几十个类重复这个逻辑,复制$toolName属性和getName((逻辑,打破了"不要重复自己"的简单规则
我考虑过的一个解决方案是:
<?php
abstract class BaseTool implements Tool {
public function getName() {
return $this->toolName;
}
}
然后简单地让工具类扩展抽象的BaseTool类:
<?php
class Drill extends BaseTool {
protected $toolName = 'drill';
}
然而,这现在意味着,如果实现类扩展了BaseTool类,我将失去强制它们定义函数getName((的能力,这可能会导致不正确的实现。
我还认为,通过让BaseTool类返回$this->toolName,它对实现类进行了假设,并破坏了封装。
我用了一个简单的例子来演示这个问题,但希望你能理解我试图解决的问题,这个问题也可能与更复杂的情况有关。感激你的想法。
如果您使用的是PHP 5.4.0+,请查看traits!
您可以创建一个ToolInterfaceTrait
,它只包含变量$toolName
的getter/setter
您的尝试看起来不错。没什么好说的了。
然而,这现在意味着,如果实现类扩展了BaseTool类,我将失去强制它们定义函数getName((的能力,这可能会导致不正确的实现。
您仍然强制它们,它们需要继承一个实现它们的类或自己实现它们。
如果所有应该实现Tool
的类都从BaseTool
扩展是不可行的,请随意创建更多实现getName()
的基类或直接实现它,就像您希望的那样。
顺便说一句,如果你计划所有的工具都应该扩展BaseTool
,那么这个接口根本就没有必要,至少对于这个用例来说没有必要。接口用于并非所有用于实现它的类都继承自同一基类的情况。
如何避免在PHP 中重复已实现的getter函数
抽象类通常用于对重复的代码进行分组。你走在正确的道路上。至于你对这个选择的怀疑。。。
然而,这现在意味着,如果实现类扩展了BaseTool类,我将失去强制它们定义函数getName((的能力,这可能会导致不正确的实现。
通过扩展BaseTool类,类继承getName()
(这就是在抽象类中定义它的想法(。我不知道为什么这会导致不正确的实现,或者为什么你必须"强制实现类来定义它"。他们通过扩展抽象类来自动获得它。
我还认为,通过让BaseTool类返回$this->toolName,它对实现类进行了假设,并破坏了封装。
如果在抽象类中定义toolName
,并在构造函数中设置其值,那么可能会更干净一些?
<?php
abstract class BaseTool implements Tool {
protected $toolName;
public function __construct($toolName)
{
$this->toolName = $toolName;
}
public function getName() {
return $this->toolName;
}
}
您可以在扩展类中定义一个构造函数来命名:
<?php
class Drill extends BaseTool {
public function __construct()
{
parent::__construct("drill");
}
}