2011-02-23 55 views
1

为您介绍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方法对于每个子类都是相同的,所以它应该是父类中的公共方法,但验证程序应该是抽象的,以强制子类实现它。

我只是勾画了这一点,在纸上概念...

+1

人们习惯于弱智化的例子,让其他人可以快速获得问题的根源。通常情况下,这是非常好的,但是如果问题是关于最佳面向对象操作的问题,那么知道确切的上下文是什么变得至关重要。类旨在表示*东西*;不知道这些东西是什么,没有什么可以设计一个类。 – erisco 2011-02-23 05:51:10

+0

在法律上,法律试图与公正匹配。在物理学中,法律可以是攻击孤儿的电锯凶手。编程中的法律更像物理上的法律。 – erisco 2011-02-23 06:17:02

+0

真的没有那么多,但我很欣赏您的反馈。更多的数据是'Parent'类是一个通用的游戏类,我们想要设置胜利的一面。小孩'GameA'只有两面,所以有效的赢面将是1,2或0(平局)。 'GameB'支持8名球员,并且可以有平局,个人获胜者或者2人或3人的获胜团队。所以,我想在父级中定义setter,并让子级决定验证。这对我来说似乎合乎逻辑,但我只是将我的小拇指蘸入OOP。 – Drew 2011-02-23 06:46:09

回答

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中没有代码。

但请明白,这取决于你如何是程序的结构。我必须至少看到该程序架构的图表,以绝对的方式说出。

+0

嗨,约拿。谢谢你的回答。你能否澄清一下你的建议,从“为什么不只是......”开始 - 我没有明白你的意思。 – Drew 2011-02-23 04:14:40

+1

这个改变有不同的意思,约拿,但我不是说这是错的。在原始文件中,父级强制执行参数设置的过程(并且该方法应定义为最终)。随着你的改变,孩子被要求以任何想要的方式设置参数(或不选)。希望这有助于澄清差异,安德鲁希思。 – erisco 2011-02-23 06:10:17

+0

我明白接口派生的替代乔纳提出,现在有一些示例代码。无论如何,他回答了我原来的问题,并提出了一个额外的想法。谢谢你们两位! – Drew 2011-02-23 06:47:40