什么时候实施和扩展?[关闭]


90
  • 什么时候应该implement还是extend可以用吗?
  • 有哪些实际示例?

它是否正确?

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

预期的现实生活场景:我有一个电子商务平台,其中包含多个都遵循相同设计的支付类别。当应添加新的付款类别时interface,从一开始就很容易遵循已定义的付款方式设计,以确保所有零散的信息都在那里。

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

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


1
我建议您阅读继承。
拉菲·凯特勒

Answers:


64

继承对于减少您重写的代码量很有用。如果您有几个带有几个常用方法或字段的类,则可以一遍又一遍地定义它们,而不必一遍又一遍地定义这些方法和字段,并可以使每个子类扩展该基类。

implements当您想为一组对象的行为定义通用协议时,接口(和)很有用。例如,您可能希望强制要求可以比较可比较的对象的相等性和哈希值等。

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

继承是OOP中的一个大概念,它不仅限于PHP。我建议您阅读维基百科上有关“继承”的文章,或者阅读《四人帮》中的“设计模式”

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


4
现在,许多人认为《四人帮》一书的内容过于繁重,无法介绍设计模式。一个流行的替代方法是“ Head First:设计模式”,使阅读更轻松。amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan 2012年

1
“请注意在多个类中定义相同方法的情况;这是极好的情况,您可以将这些方法作为基本类的一部分。” 与使用Trait定义那些方法相比,扩展Class是否有好处?
Daniel Weiner 2015年

1
“继承对减少重写的代码很有用”-继承的目的是共享行为,而不是代码。在可能的情况下,特质是共享代码的一种方式,而不是用抽象类扩展抽象类,而这些具体类之间没有任何共同点。您通常也可以将类建模为has-a而非is-a关系,这将进一步促进代码可重用性和多态性。
邓肯

12

实行:

接口是抽象类,因此您只能声明事物。一个类实现一个接口。您可以实现多个接口。

延伸:

当您需要类的更特定版本时,可以扩展类。

例:

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

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


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

骆驼和狗都是动物,因此它们扩展了Animal阶级。但只有犬是一种特定类型Animal那个可以是Pet

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.