【发布时间】:2014-05-16 03:58:36
【问题描述】:
我有一个抽象类,它声明了它的子类所需的方法。它还有一个由其子代继承的委托人。如何使抽象类影响扩展它的类的子类。为了进一步澄清我的问题,这是我的情况:
抽象类(abstract.php):
<?php
include_once 'database.php';
include_once 'validation.php';
abstract class DataOperations extends DatabaseConnection {
//The error string shared by all children of DataOperations
//This will be the message to be displayed in case validation failure
public $validator;
public $err_valid_string;
/**
* The DataOperations' constructor ensures that all of its children can perform database operation
* by automatically starting it for them. In case a child overrides this constructor, this child
* must explicitly start the connection to prevent fatal errors. Also, $validator must be re-instantiated
*/
public function __construct() {
$this->startDBConnection();
$this->validator = new InputValidator();
}
public function __destruct() {
}
abstract public function validateData();
abstract public function loadRecord($key, $cascade);
abstract public function saveRecord();
abstract public function updateRecord();
abstract public function deleteRecord();
}
?>
现在,这是扩展 DataOperations 抽象类的子对象
class Guest extends DataOperations {
//some properties here
public function validateData() {
//implementation
}
public function newRecord(implementation) {
//implementation
}
public function loadRecord($key, $cascade){
//implementation
}
public function saveRecord() {
//implementation
}
public function updateRecord() {
//implementation
}
public function deleteRecord() {
//implementation
}
}
?>
这是另一个类,它是 Guest 的子类
class Booking extends Guest {
//some properties here
public function validateData() {
//implementation
}
public function newRecord(implementation) {
//implementation
}
public function loadRecord($key, $cascade){
//implementation
}
public function saveRecord() {
//implementation
}
public function updateRecord() {
//implementation
}
public function deleteRecord() {
//implementation
}
}
?>
问题是,如果我在 Booking 中删除一个方法,比如 deleteRecord(),PHP 不会抛出错误,因为我认为抽象类不会影响它的“孙子”。我怎样才能解决这个问题?我想过使用接口,但我的系统已经有 11 个类,它们依赖于抽象类的某些方法。这将需要密集的重构。
【问题讨论】:
-
如果去掉
Booking中的deleteRecord,它会继承自Guest,所以满足了实现deleteRecord的条件。根据您的情况,您可能希望使 Guest 成为抽象类。但是接口可能是要走的路