如何限制班级method
仅限object
扩展特定班级的class
?
代码:
串行器接口
namespace App\API\Serializers;
use Illuminate\Database\Eloquent\Model;
interface Serializer
{
public function serialize(Model $model);
}
namespace App\API\Serializers;
use App\API\Serializers\Serializer;
use App\Models\Article;
class MilestoneListSerializer implements Serializer
{
public function serialize(Article $article)
{
}
}
我想传递Article
作为参数,而它正在扩展Illuminate\Database\Eloquent\Model
类
有没有办法做到这一点,请帮助我。
感谢任何帮助。感谢。
答案 0 :(得分:1)
不,你不能这样做。接口定义了契约:方法的所有实现都应该接受Model类的任何实例。如果限制参数类型,则会破坏此合约。这违反了Liskov substitution principle。
某些语言支持反转功能:参数的逆变,但没有人承认它们的协方差。
您可以手动检查类型并抛出异常。实际上这仍然是LSP违规,但有时它可能是有用的。其他方法是修改您的体系结构和类层次结构。
答案 1 :(得分:1)
将参数从DATASET ACTIVATE test1.
SORT CASES BY ID.
DATASET ACTIVATE test2.
SORT CASES BY ID.
MATCH FILES FILE=test1 /FILE=test2 /BY ID.
DATASET NAME Restult.
更改为Serializer interface
时,您正在更改serialize
Model
方法签名。您应该保留Article
,如果Model
延伸Article
,那么您就可以将其传递给该方法。
界面序列化程序
Model
MilestoneListSerializer
namespace App\API\Serializers;
use Illuminate\Database\Eloquent\Model;
interface Serializer
{
public function serialize(Model $modelOrItsSubTypes);
}
第
namespace App\API\Serializers;
use App\API\Serializers\Serializer;
use App\Models\Article;
class MilestoneListSerializer implements Serializer
{
public function serialize(Model $modelOrItsSubTypes)
{
// ... Use Model methods here
}
}