代码之家  ›  专栏  ›  技术社区  ›  ryeguy

以下哪种继承技术是更好的实践?

  •  1
  • ryeguy  · 技术社区  · 15 年前

    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 起源 上课的时候 福巴 那叫什么?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Romain Hippeau    15 年前

    那个 Liskov Substitution Principle 声明:

    类型为T的对象o2 对于P定义的所有程序 T、 当 o1取代o2,则S为a “T”的子类型

    意思是:

    在您的示例中,您通过更改foobar方法的签名(重写)违反了这一点。foobar对外界应该有相同的签名,它可以用相关的意图做一些不同的事情。如果你需要另一个函数,那么给它起个不同的名字,你的孩子就不再是父母的isa了。

        2
  •  2
  •   Uri    15 年前

    首先,没有共同命名的理由。把父母叫做“doFoobarOnGivenData”(你明白我的意思)。

    另外,是否所有的子代都有完全相同的代码,或者每个子代获取的数据不同?

        3
  •  1
  •   Adam Robinson    15 年前

    这更像是创建重载的问题,而不是使用具有类似(但不同)名称的方法的问题。这个问题没有真正的“正确”答案,尽管我喜欢超负荷。