为您介绍OOP问题:
情况:我想要一个带有公共setter和抽象验证器的抽象类,因为每个子节点都会以独特的方式验证该属性。
代码:
abstract class Parent {
public function setName($name) {
if (validateName($name)) {
$this->_name = $name;
} else {
// error msg
}
}
abstract public function validateName($name);
}
class Child extends Parent {
public function validateName($name) {
// ensure name gits this child's requirements
}
}
问题:这是一种“合法”的设计方法吗?我想,因为setName
方法对于每个子类都是相同的,所以它应该是父类中的公共方法,但验证器应该是抽象的,以强制子类实现它。
我只是概念性地将它写在纸上......
答案 0 :(得分:2)
是的,这是一种有效的方法,尽管你的语法不完美:
if (validateName($name)) {
应该是这样的:
if ($this->validateName($name)) {
但如果这是架构的范围,为什么不定义验证和设置它的抽象setName()
呢?像这样:
interface Parent {
public function setName($name);
}
class Child implements Parent {
public function setName($name) {
if (/* $name is valid */) {
$this->_name = $name;
} else {
// error message
}
}
}
当然我在这里使用了一个界面,因为在Parent中没有代码。
但请注意,这取决于您的计划结构。我必须至少看到程序架构的图表,无论如何都要说明。