2017-06-29 5 views
0

メソッドシグネチャを変更する必要がある場合、OOPおよびSOLIDの原則に準拠したPHPで子クラスのメソッドをオーバーロードする方法。これにはいくつかのデザインパターンがありますか?メソッドシグネチャを変更する必要があるときに、OOPおよびSOLIDの原則を遵守して、PHPで子クラスのメソッドをオーバーロードする方法

<?php 

class Client extends People 
{ 
    protected function fillData(ClientDTO $clientDTO) 
    { 
     parent::fillData($clientDTO); 
     ... 
    } 
} 

class People 
{ 
    protected function fillData(PeopleDTO $peopleDTO) 
    { 
     ... 
    } 
} 

class ClientDTO extends PeopleDTO 
{ 
    protected $orders; 
} 

class PeopleDTO 
{ 
    protected $name; 
} 

?> 
+1

である必要があります。メソッドのシグネチャが変更された場合、その子は親のメソッドをオーバーロードしていません。それは新しい方法を作り出しています。 – sorayadragon

+1

短い答え:あなたが望むのは、特殊なサブタイプではなく、別のクラスです。 –

+0

ここのパターンは[抽象的な工場パターン](https://en.wikipedia.org/wiki/Abstract_factory_pattern)になります。 )、これはおそらく(おそらく)あなたが達成したいと思うものに対する過剰なものです。それはより大きなパターンであり、把握するのは難しいです。これにより、同じインターフェース(つまり、抽象クラス)を共有する異なるクラスのクラスを扱うことができます。あなたがパターンを尋ねたときにコメントするだけです。 – hakre

答えて

1

署名は限りClientDTOPeopleDTOのサブクラスであるとして、あなたの特定のケースに対応しているので、私は、メソッドのシグネチャを変更することについては、ここで心配しないでしょう。 ClientDTOインスタンスをPeople::fillDataに渡すことはできますが、それでも動作します。だから私は、その観点からの心配はないと言います。 しかし、あなたの署名にハードコードされたクラス依存関係の代わりにインタフェースを使うべきです。必要に応じて戦略パターンと呼ぶことができます。これにより、クラスは抽象化に依存するため、Open \ ClosedとDependency Inversionの原則を尊重します。あるいは、インタフェースの作成が過度のものであると思われる場合や、エンティティがドメイン固有のものであると思われる場合は、少なくとも基本抽象クラスを使用する必要があります。

P.S. class ClientDTOclass PeopleDTO

+0

確かに、あなたのコードサンプルで間違いを犯しました:class ClientDTOはPeopleDTOクラスでなければなりません – malheirosrafa

関連する問題