implement
或extend
?实现似乎是一种强制某类方法存在的方法,并且这些方法函数调用的格式正确。实现不是一种将变量或“设置”传递给类的方法吗?
预期的现实生活场景:我有一个电子商务平台,其中包含多个支付类,所有支付类都遵循相同的设计。当应该添加新的支付类时,很容易遵循interface
的定义设计,以确保从一开始就存在所有的零碎。
扩展类使得扩展(child?)类继承其父类的所有内容,但方法&变量声明为private
?
预期的现实场景:我有一个名为sessions
的类,其中有两个名为sessioncookies
和databasesessions
的子类。 sessioncookies
和databasesessions
一起从其父会话中继承了许多相互配置选项,从而可以轻松更改配置选项以影响各种最终的访问者数据存储。
答案 0 :(得分:57)
继承对减少重写的代码量很有用。如果你有几个带有一些常用方法或字段的类,而不是一遍又一遍地定义这些方法和字段,你可以将它们分解为基类,并让每个子类扩展该基类。
当您要为一组对象的行为方式定义一个公共协议时,接口(和implements
)非常有用。例如,您可能希望强制比较可比较的对象的相等性和散列等。
使用继承最终是一种设计选择。请留意您在多个类中定义相同方法的情况;这些都是很好的情况,你可以将这些方法分解为基类。对于观察到一些相同特征的类也是如此:通过将这些特性放在接口中以便由相关类实现,可以保证一致性。
继承是OOP中的一个重要概念,它不仅仅是PHP。我建议您阅读the wikipedia article on inheritance,也许Design Patterns by the Gang of Four。
我相信你对继承的理解主要是正确的。下一步是在生产中使用它。
答案 1 :(得分:0)
实施:
接口是抽象类,因此您只能声明事物。实现是为了实现接口!您可以实现多个接口。
扩展:
您想要扩展类时,想要一个特定的类版本。
示例:
abstract class Animal {
private String name;
public void eat();
public void sleep();
}
public interface Pet {
public void play();
}
public class Dog extends Animal implements Pet {
public void eat() {
// do stuff
}
public void sleep() {
// do stuff
}
public void play() {
// do stuff
}
}
public class Hippo extends Animal {
public void eat() {
// do stuff
}
public void sleep() {
// do stuff
}
}
河马和狗都是动物,因为它们都是动物。但是只有狗可以是宠物!