哪种继承技术是更好的做法?

时间:2010-07-02 18:23:13

标签: oop inheritance

让我说我有这样的事情:

abstract class Parent
{
    protected function foobar($data)
    {
        //do something with data
        return $result;
    }
} 

class Child extends Parent
{
    public function foobar()
    {
        $data = ...;

        return parent::foobar($data);
    }
}

如您所见,foobar通常在Parent中定义,然后Child将特定于类的数据传递给返回结果的父级。这样做的原因是因为父类的每个子类都有自己的数据,但方法本身保持不变 - 只有参数不同。孩子也公开揭露这种方法。

做这样的事情更好吗,我在父母和孩子中创建了一个同名的方法?或者我应该在_foobar课程中创建一个Parent方法,并且只需调用Child的{​​{1}}方法吗?

3 个答案:

答案 0 :(得分:2)

首先,没有理由进行通用命名。给父母打电话就像“doFoobarOnGivenData”(你得到我的漂移)。

此外,所有孩子都拥有完全相同的代码,或者每个孩子的数据都不同吗? 在父级中使用单个公共foobar方法可能会更好,这将调用抽象“getDataForFoobar”。然后,每个孩子只需要覆盖获取数据的方式。

答案 1 :(得分:2)

Liskov Substitution Principle表示:

  

如果对于S型的每个对象o1那里   是类型为T的对象o2   对于按照定义的所有程序P.   T,P的行为在不变的时候   o1代替o2,则S代表a   T的子类型。“

意思是: 使用指针或对基类的引用的函数必须能够在不知道的情况下使用派生类的对象。

在您的示例中,您通过更改foobar方法的签名(覆盖)来违反该示例。 foob​​ar应该与外部世界具有相同的签名,它可以通过相关的意图做出不同的事情。如果您需要其他功能,请将其命名为不同的,您的孩子不再成为父母的isa。

答案 2 :(得分:1)

这更像是一个创建重载的问题,而不是使用具有相似(但不同)名称的方法。对此没有真正“正确”的答案,尽管我赞成过载。