有几个类的很相似,只是其方法对数据处理的逻辑和最后数据输出的结果有些差别,可以通过这样的思路实现吗?1.思路一,通过修改抽象函数逻辑实现返回值不同abstract class parents{
protected $data = array();
public function get_content(
$this->data = sql_get_content();
return data_function($this->data);
);
protected sql_get_content(){
//DB功能
}
abstract protected function data_function();
}class child extends parents{
abstract protected function data_function($data){
//不同类对$data的处理逻辑不一样,使得get_content()返回的结果不一样
};
}2.思路二,继承父类的函数,不同子类在后面加不同的逻辑处理,最后返回不同结果。很想知道这个方法能不能行得通abstract class parents{
protected $data = array();
public $result;
public function get_content(
$this->data = sql_get_content();
);
protected sql_get_content(){
//DB功能
}
}class child extends parents{
public function get_content(
parent::get_content();
//不同类对$data的处理逻辑不一样,使得get_content()返回的结果不一样
return $this->result;
);
}
1 回答
已采纳
思君满月
TA贡献82条经验 获得超36个赞
通过继承和复写是实现多态的一个手段:其实你这两种思路,本质上都是一样的。
你的思路一对外只提供了一个接口,get_content,因为data_function()是保护的,所以你没打算让外界访问这个方法,只是用于类内部使用。子类通过复写这个方法既可以实现不同的处理逻辑。
也许你会发现data_function其实只能在类内部访问,而且只被get_content访问,所以不如直接把它实现到get_function中,这时候子类必须复写get_content方法,并且增加处理逻辑。
个人感觉思路一会好点,原因有2:
思路一把处理逻辑抽象出来,一旦将来需求变化,处理逻辑需要在其他地方使用,思路1会很方便。
我们通常是复写抽象方法,或实现接口方法,而不是复写一个已经实现的方法。
其实思路一还可以进一步优化:
因为我们的类只要是提供内容,数据的处理逻辑更像是一种工具,所以不如把处理逻辑抽象成一个接口,想这样:
// 抽象工具 interface DataTool{ public function date_function($data); } // 具体工具 class DataTool1 implements DataTool{ public function data_function($data){ //处理逻辑 return $data; } } // 内容提供者 class Parent{ private DataTool $dataTool; public Parent(DataTool $dataTool){ $this->dataTool = $dataTool; } protected get_sql_content(){ // sql_content } public get_content(){ $sql_content = $this->get_sql_content(); $data = $this->dataTool->data_function($sql_content); return $data; } }
好处你可以自己思考,写太多了。
- 1 回答
- 0 关注
- 1344 浏览
添加回答
举报
0/150
提交
取消