我的父类有一些依赖于只能由子类设置的属性的方法.实现这一目标的"最佳"方法是什么?
另外 - 父方法依赖于孩子需要提供的东西是不是很糟糕的OOP?
我在PHP中这样做,如果这很重要.
所以...你有一个类有一个算法,另一个类负责提供该算法的数据...当我这样说时,你是否仍然有理由让这些类之一成为一个另一方的父母?
您的"父类"应该将"子类"的对象作为构造函数中的参数,然后使用该对象来完成其工作.这种组合模式更加可靠,可重用且易于理解.
有关详细信息,请参阅设计模式文献中的策略模式.
换句话说,而不是这样:
+--------------+
| Parent |
+--------------+
|*getName() |
|showGreeting()|
+-----+--------+
^
|
|
+----+-----+
| Child |
+----------+
|*getName()|
+----------+
Run Code Online (Sandbox Code Playgroud)
做这个:
+--------------------+ +----------+
| Parent | | Child |
+--------------------+ +----------+
|Parent(child: Child)|--->| getName()|
|showGreeting() | +----------+
+--------------------+
Run Code Online (Sandbox Code Playgroud)
在 PHP 中处理这个问题的方法与在任何像样的语言中处理它的方法是一样的——使用protected abstract
方法。
http://php.net/manual/en/language.oop5.abstract.php
<?php
abstract class AbstractClass
{
// Our abstract method only needs to define the required arguments
abstract protected function prefixName($name);
}
class ConcreteClass extends AbstractClass
{
// Our child class may define optional arguments not in the parent's signature
public function prefixName($name, $separator = ".") {
if ($name == "Pacman") {
$prefix = "Mr";
} elseif ($name == "Pacwoman") {
$prefix = "Mrs";
} else {
$prefix = "";
}
return "{$prefix}{$separator} {$name}";
}
}
$class = new ConcreteClass;
echo $class->prefixName("Pacman"), "\n";
echo $class->prefixName("Pacwoman"), "\n";
?>
Run Code Online (Sandbox Code Playgroud)