【问题标题】:should my child classes inherit empty functions from parent class?我的子类应该从父类继承空函数吗?
【发布时间】:2021-10-14 07:00:39
【问题描述】:

我正在尝试创建一个父类和子类,假设父类被称为功能,并且具有add()validate()delete() 之类的功能,子类是 driver 和乘客,每个子类都继承了函数,但每个继承的函数都需要额外的参数和不同的逻辑,我应该定义函数但将其留空吗?除了可扩展性之外,这有什么帮助?我应该为每个子类定义不同的构造函数,因为它们有不同的额外变量吗?

类功能

class functionality{
    
    protected $from;
    protected $to;
    protected $date;
    protected $name;
    
  public function add(){
      
  }
  
   public function validate(){
      
  }
  
  public function delete(){
      
  }
  
 
}

类驱动

class driver extends functionality {

private $gasMoney

function add($from, $to, $date, $name, $gasMoney){

//some logic and adding to database

}

}

客舱乘客

class passenger extends functionality {

private $seatPrefrance

function add($from, $to, $date, $name, $seatPreferance){
//different logic than class driver and 

}

}

这是一种可接受的方法吗?我将如何定义构造函数?我应该在父类中定义它吗?子类是否继承它并可以添加更多?

【问题讨论】:

    标签: php oop


    【解决方案1】:

    不应该为此使用继承,这没有意义。

    主要思想是你的应用程序的其他部分可以接收一个对象,他们不关心它是passenger还是driver,他们只是获取functionality的一些实例并调用add on它。

    如果您想利用某些共享行为,使用继承的另一个原因是您不必重新实现方法。

    如果基于子类的参数不同,那么通用functionality 类将无法做任何事情,所以这是没有意义的。

    您也不能重复使用该方法,因为您显然会为每种情况覆盖该方法。

    想想driverpassenger。您的应用程序中是否有需要同时使用两者的部分?它们的实际共同功能是什么?任何不常见的东西都不会放在基类中。

    我知道这可能是一个人为的例子,但是将乘客姓名“添加”到现有乘客也没有意义。

    如果你称你的班级为“乘客”,我希望它代表一个单个乘客,而不是多个。

    【讨论】:

    • “如果基于子类的参数不同,那么任何东西都无法对通用功能类做些什么”......我的意图不是要使用功能类,它是一种定义hared变量和覆盖函数的方法,所以如果我想添加另一个扩展功能类的类,它会更容易
    • “您的应用程序中是否有需要同时使用两者的部分?它们的实际通用功能是什么?”......它们没有通用代码,只是两者都有的想法例如,一个名为 add() 的继承函数,它以不同方式将数据输入数据库,或者一个函数 validation(),它以不同方式验证数据 我真的不擅长这个 我不知道如何重新开始,我觉得这么低
    • “将乘客姓名‘添加’到现有乘客上也没有任何意义。”我不确定我是否理解您的意思,但我编辑了名称,该名称不应仅存在于乘客类中,但我不明白您对现有乘客的含义,该名称用于函数中将其输入到数据库中。
    • @hemolNNESS,那么让我重复一遍。您不需要 functionality 类。不要从它延伸。
    • 所以如果每个类中的每个函数不共享实际代码,我应该自己定义它们吗?
    【解决方案2】:

    将 OOP 作为一种工具而不是一种宗教来学习。

    如果你遇到一位鼓舞人心的传教士,他们可能会教你一种全新的思考世界的方式,突然间你会以全新的眼光看待一切。你改变你的饮食、你的日常生活和你看的电视节目。

    如果你收到了一个新的钻头作为礼物,你可能会得到一些木头来测试它几次,但之后你会等到需要架起一些架子.你不会知道如何通过早餐柜台上新钻的孔倒牛奶。

    您提出的示例是为了 OOP 而尝试执行 OOP。这没有任何意义,因为您实际上并没有遇到要解决的问题。

    特别是,在需要之前不要拔出继承练习。首先寻找在私有属性中封装状态定义行为,而不仅仅是访问该状态。举个愚蠢的例子,$driver->canLegallyDrive() 方法可能会在内部检查 $insurance$alcoholLevel 属性。

    即使您找到想要共享的逻辑,组合(只是将一个对象存储在另一个对象的私有属性中)通常比继承更好。当您需要多态性时,继承真正发挥作用 - 多个对象在外部看起来相同,但在内部表现不同。即便如此,学习使用接口而不是基类将释放更多潜力。

    【讨论】:

      猜你喜欢
      • 2012-04-11
      • 2011-04-21
      • 1970-01-01
      • 2013-03-03
      • 2023-03-27
      • 1970-01-01
      • 2016-09-02
      • 1970-01-01
      • 2013-09-02
      相关资源
      最近更新 更多