在这个文件中,我有类似的东西:
class MY_Controller extends CI_CONTROLLER
{
public function __construct()
{
parent::__construct();
}
}
class MY_Membre_Controller extends MY_Controller
{
public function __construct()
{
parent::__construct();
}
}
class MY_Admin_Controller extends MY_Membre_Controller
{
public function __construct()
{
parent::__construct();
}
}
然后在我的控制器/我有例子
class Member extends MY_Membre_Controller
{
/* .. construc etc */
public function loadPicture() ...
others functions ..
}
现在我可以做一个Admin
类扩展MY_Admin_Controller
并且可以使用Member方法(因为管理员是其他功能的成员)
因为我无法使用Member方法执行类似的操作:
class Admin extends MY_Admin_Controller
{
/* construct */
/* function index()
{
$this->loadPicture
}
}
答案 0 :(得分:0)
我不确定你为什么要首先为这些做出自己的控制器扩展。为什么不让你的成员控制器成为一个接口而不是一个类,然后让你的Admin_Controller实现该接口?您将可以访问这些方法,并且is-a关系仍将保持Admin_controller是一个Member_controller,并且您的Admin控制器也可以访问Member_Controller中定义的方法,因为它们实际上是已实现的在Admin_Controller中。在实现包含的方法时实现Member_controller的其他类,也为它们提供了与Member_controller的is-a关系。
我在这里屠宰你的代码,只是试图让这个想法得到解决,所以你需要清理它:
interface MY_Member_ControllerI extends CI_Controller{
public function __construct();
public function loadPicture();
}
class MY_Admin_Controller implements MY_Member_ControllerI{
public function __construct(){
//some contruct stuff
}
public function loadPicture(){
//load the picture
}
public function adminMethod(){
//some admin stuff
}
}
class My_Member_Controller implements MY_Member_ControllerI{
public function __construct(){
//some contruct stuff
}
public function loadPicture(){
//load the picture
}
public function memberMethod(){
//some admin stuff
}
}
所以在这一点上,Admin和Member都与MY_Member_ControllerI接口有一个is-a关系,使它们都是相同的根类型
或者,重载Admin_Controller中的方法,以便在子类调用它们时,调用Admin_controller,Parent_Controller的父类中的相应方法。
例如
class MY_Member_Controller extends MY_Controller{
public function __contruct(){
//construct stuff
}
public function doStuff($stuff){
//do some stuff with stuff
}
public function loadImage(){
//implement load image
}
}
class MY_Admin_Controller extends MY_Member_Controller{
public function __construct(){
parent::__construct();
//plus other admin stuff
}
public function adminOnly(){
//admin only stuff
}
public function loadImage(){
parent::loadImage();
}
}
class Admin extends MY_Admin_Controller{
public function __construct(){
parent::__construct();
//plus other admin stuff
}
public function adminOnly(){
//admin only stuff
}
public function loadImage(){
parent::loadImage();
}
}
我正在考虑其他一些方法也可以做到这一点。您有什么方法可以重新考虑您的可重用架构吗?听起来你可以真正受益于其他一些继承方法,如接口和抽象类,或滥用方法重载。