说我有以下代码,是否有办法以某种方式在子级上扩展抽象类,并在“重载”函数中需要不同类型的参数。我想通过add函数在Collection中插入各种类型的对象。在某些情况下,我想插入一个Error对象,有时要插入其他一些(XYZ)对象,并且可以说所有这些对象都扩展了一个称为Parent的同一个抽象类。
如果有人能告诉我这样的事情是否可行,以及是否建议实现此目的的一些方法,我将不胜感激。请注意,我打算在其中托管应用程序的生产服务器在php 5.6.40上运行。
谢谢。
namespace App;
use App\Models\Parent;
abstract class Collection
{
protected $collection;
public function __construct()
{
$this->collection = array();
}
abstract public function add($key, Parent $item);
}
public class ErrorList extends Collection
{
public function __construct()
{
parent::__construct();
}
public function add($key, Error $item)
{
$this->collection[$key] = $item;
}
}
namespace App\Models;
abstract class Parent {}
public class Error extends Parent {}
public class XYZ extends Parent{}
答案 0 :(得分:0)
尝试一下
abstract class Collection
{
protected $collection;
public function __construct()
{
$this->collection = array();
}
//no type hinting
abstract public function add($key, $item);
}
class ErrorList extends Collection
{
// this constructor doing nothing , it can be removed and
// parent constructor will still be called unlike java or any other
// OOP
public function __construct()
{
parent::__construct();
}
//no type hinting
public function add($key, $item)
{
//code
}
}
答案 1 :(得分:-1)
如果要扩展类或实现接口,则签名必须匹配。但是,您可以自己进行类型检查,并在文档块中键入提示。
请注意,public class
是无效的语法。
abstract class Collection
{
protected $collection;
public function __construct()
{
$this->collection = array();
}
abstract public function add($key, Parent $item);
}
class ErrorList extends Collection
{
public function __construct()
{
parent::__construct();
}
/**
* @param $key
* @param Parent|Error $item
*/
public function add($key, Parent $item)
{
if (!($item instanceof Error)) {
throw new \InvalidArgumentException('Unable to add object to error list: ' . get_class($item));
}
$this->collection[$key] = $item;
}
}