何时实施和扩展?[已关闭]

2022-08-30 07:35:43
  • 何时应该使用或何时使用?implementextend
  • 有哪些现实世界的例子?

这是正确的吗?

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

预期的现实生活场景:我有一个电子商务平台,具有多个支付类别,都遵循相同的设计。当应该添加新的支付类别时,很容易遵循定义的设计,以确保从一开始就存在所有零碎的东西。interface

扩展类使扩展(子类?)类从其父类继承所有内容,但声明为 ?private

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


答案 1

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

接口(和 )在您想要为一组对象的行为方式定义通用协议时非常有用。例如,您可能希望强制要求可以比较具有可比性的对象以实现相等和散列等。implements

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

继承是OOP中的一个大概念,它远远超出了PHP的范围。我建议你阅读维基百科上关于继承的文章,也许还有四人帮的设计模式

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


答案 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           
    }
}

骆驼和狗都是动物,所以它们扩展了阶级。但只有狗是一种特定的种类也可以是.AnimalAnimalPet

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

// 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
}

推荐