【问题标题】:When to implement and extend? [closed]何时实施和扩展? [关闭]
【发布时间】:2011-06-25 02:48:48
【问题描述】:
  • 什么时候应该使用implementextend
  • 有哪些实际示例?

这是正确的吗?

实现似乎是一种强制类中存在某些方法的方法,并且这些方法的函数调用格式正确。实现不是不是将变量或“设置”传递给类的方式吗?

预期的现实生活场景:我有一个电子商务平台,其中包含多个支付类,它们都遵循相同的设计。当应该添加一个新的支付类时,很容易遵循interface 的定义设计,从一开始就确保所有的点点滴滴都在那里。

扩展类使扩展(子?)类继承其父类的所有内容,但声明为private的方法和变量除外?

预期的现实生活场景: 我有一个名为sessions 的类,有两个名为sessioncookiesdatabasesessions 的子类。 sessioncookiesdatabasesessions 一起从其父会话继承了许多相互配置选项,从而可以轻松更改配置选项以影响各种最终访问者数据存储。

【问题讨论】:

  • 我建议你阅读继承。

标签: php oop extend


【解决方案1】:

继承有助于减少您重写的代码量。如果您有多个具有一些公共方法或字段的类,您可以将它们分解为一个基类,并让每个子类扩展该基类,而不是一遍又一遍地定义这些方法和字段。

接口(和implements)在您想为一组对象的行为定义一个通用协议 时很有用。例如,您可能希望强制比较可比较的对象的相等性和散列等。

使用继承最终是一种设计选择。注意在多个类中定义相同方法的情况;这些都是极好的案例,您可以将这些方法分解到基类中。观察一些相同特征的类也是如此:您可以通过将这些特征放在由这些相关类实现的接口中来保证一致性。

继承是 OOP 中的一个重要概念,远远超出了 PHP。我建议你阅读the wikipedia article on inheritance 或者Design Patterns by the Gang of Four

我相信您对继承的理解基本上是正确的。下一步是在生产中使用它。

【讨论】:

  • 现在很多人认为《四人帮》这本书在材料方面过于沉重,因为它是对设计模式的介绍。一种流行的替代方法是 Head First: Design Patterns,它使阅读变得更轻松。 amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
  • “请留意跨多个类定义相同方法的情况;这些情况非常好,您可以将这些方法分解到基类中。”与使用 Trait 来定义这些方法相比,扩展 Class 是否有好处?
  • “继承有助于减少您重写的代码量” - 继承的目的是共享行为,而不是代码。在可能的情况下,特征是共享代码的方式,而不是用没有共同点的具体类扩展抽象类。您通常也可以将类建模为 has-a 而不是 is-a 关系,这将进一步促进代码可重用性和多态性。
【解决方案2】:

实施: 接口是没有实现细节的抽象类,所以你只能声明事物(Contracts)。一个类实现一个接口以确保它遵循接口的规则和约定。一个类可以实现多个接口。

扩展: 当您想要一个更具体的版本类时,您可以扩展类。而且你也不想重复编写父类中存在的其他方法。

示例:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat(){ //details };
    public void sleep(){ //details };
}


public class Camel extends Animal {
    // no need to implement eat() and sleep() but
    // either of them can be implemented if needed. i.e. 
    // if Camel eats or sleeps diffrently from other animals!
}

public class Dog extends Animal implements Pet {    
    public void play() {
       // MUST implemt play() details           
    }
}

Camel 和 Dog 都是动物,因此它们扩展了 Animal 类。但只有 Dog 是 Animal特定种类可以是 Pet

正如您所见,该主题已关闭,因为它是基于意见的,因此没有确切的正确答案。这是一种设计选择,取决于情况和项目需求。你有两种选择,现在你可以决定什么是最好的选择。例如,狗类不必总是像上面的例子那样,如果项目都是关于不同种类的狗(而不是其他动物),甚至它们的睡眠和饮食差异也很重要!可以是这样的:

// the main contract
public interface Dog {
   public void eat();
   public void sleep();
} 

// Contract
public interface Pet {
    public void play(); 
} 

// Contract
public interface Hunter {
    public void hunt();
}

public class FamilyDogs implements Dog, Pet {
    // must implement all details
} 

public class GuardDogs implements Dog, Hunter {    
    // must implement all details
}

【讨论】:

    猜你喜欢
    • 2020-06-03
    • 2018-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多