コードをコピー コードは次のとおりです:
/*
私は、自分自身の読みやすさを目的として、学習と実践を同時に行っています。また、専門家の指導を受けながら公開しています。専門家の指導...
[ヒント] この例はエラーなしでテストに合格しました
[シナリオ デザイン]
コンピューターのマザーボード IDE インターフェイスをシミュレートします。たとえば、マザーボードがアクセスできるストレージには光学式ドライブが含まれることがよくあります。 、ハードディスク、フラッシュ メモリなど。
便宜上、これらの異なるメモリに対して同じインターフェイスを設定する必要があります。
この例では、独自のアクセス方法を持つ前例のないエイリアン メモリもアクセスのためにマザーボードに追加されることを前提としています。
そのため、結合された設計パターンを採用する必要があります。
[この例の主な説明]
1. いわゆる「インターフェイス」モードは、インターフェイス、抽象クラス、および一般クラスの継承によって実現されます。
A.サブクラスは特別な親クラスであるため、親クラスとして使用できます。
B. この3つの実装方法では、インターフェース、抽象クラス、一般クラスの継承の基底クラスの書き方に注目してください!
2. インターフェースモードはまさに契約です!
3. プログラミングの「結合設計パターン」!
*/
//----------------------------------------------------- -----------------------------
/*[方法 1] インターフェースの実装方法:*/
インターフェースreadandwrite {
関数 read();
関数 write();
クラス マザーボード{
プライベート $storage
関数 __construct(readandwrite $obj); this ->storage=$obj;
}
関数 read(){
$this->storage->read();
関数 write(){
$this->storage->write();
}
}
クラス フラッシュは readandwrite{
function __construct(){
echo "私はフラッシュ メモリです:< ;br> ;";
}
function read(){
echo "データの読み取りを開始します...
";
}
function write(){
echo "データの保存を開始します...
";
}
}
class yingpanimplements readandwrite{
function __construct(){
echo "私はハードディスクです :< br>";
}
function read(){
echo "データの読み取りを開始します...
";
}
function write( ){
echo "データの保存を開始します...
";
}
}
class discoimplements readandwrite{
function __construct(){
echo "私は CD:
";
}
function read(){
echo "データの読み取りを開始...
";
}
function write(){
echo "保存を開始データ...
";
}
}
//----------- ---------------- ---------------------------------- ---------
/*[メソッド2] 抽象クラスの実装:
abstract class readandwrite{
abstract function read();
}
class motherboard{
private $storage; >function __construct(readandwrite $obj){
$this->storage=$obj;
}
function read() {
$this->storage->read();
}
function write(){
$this->storage->write();
}
}
class flash extends readandwrite{
function __construct( ){
echo "私はフラッシュです:
";
function read(){
echo "データの読み取りを開始します...
";
function write(){
echo "データの保存を開始します...
";
}
}
class yingpan extends readandwrite{
function __construct(){
echo "私はハードディスクです:
";
function read(){
echo "データの読み取りを開始します...
}
function write(){
echo "データの保存を開始...
}
}
class disco extends readandwrite{
function __construct(){
echo "私はディスクです:
";
}
function read(){
echo "データの読み取りを開始します...
}
function write(){
echo "データの保存を開始します... .
"
}
}
*/
//--------- ---------------- ---------------------------------- -----------
// [メソッド 3] 一般的なクラス継承実装メソッド:
/*
class readandwrite{
function read(){
echo "読み取り中...." ;
}
function write(){
echo "書き込み中....";
}
}
クラスマザーボード{
private $storage;
function __construct(readandwrite $obj){
$this->storage=$obj;
function read(){
$this->storage->read();
}
関数 write(){
$this->storage->write(); >}
}
class flash extends readandwrite{
function __construct(){
echo "私はフラッシュ メモリです:
";
}
function read(){
echo "データの読み取りを開始します...
";
}
function write(){
echo "データの保存を開始します...
"; 🎜>}
}
class yingpan extends readandwrite{
function __construct(){
echo "私はハードディスクです:
}
function read( ){
echo "データの読み取りを開始します...
";
function write(){
echo "データの保存を開始します...
"; >}
}
class disco extends readandwrite{
function __construct(){
echo "私は CD:
";
}
function read(){
echo " データの読み取りを開始します...
";
function write(){
echo "データの保存を開始します...
";
}
*/
//--------------------------------- -- ----------------------------------
/*
【カップリングモード】
結合モードは、異なる標準を持つ 2 つのクラスを結合することです (この例では、インターフェイス、抽象クラス、通常の基底クラス、およびエイリアン ストレージは異なるアクセス方法を持っています)。
中間コンバータを通じて同じ標準を実現します。ちょうど転送ラインのようになります。 - この例では、未知のクラスの Rdata メソッドと Wdata メソッドを読み取りメソッドと書き込みメソッドに変換して、この例のインターフェイス、抽象クラス、通常の基本クラスと同じアクセス メソッドを実現します。 この例では、中間コンバーターは アダプタークラス。
PHP ではクラスは 1 つしか継承できませんが、インターフェースは複数継承できるため、次の 3 つの結合方法が作成されました。
方法 1: 中間コンバーター Apdater クラスは抽象クラスまたは通常の基底クラスを継承しますが、PHP では継承のみであるため、クラスを継承できるので、Apdaterの
クラスにエイリアンメモリクラスの未知のオブジェクトを定義し、継承した抽象クラスや通常の基底クラスのアクセスメソッドをオーバーロードすることでアクセスメソッドを変換
することができます。同じアクセス方法の目的。
方法 2: 中間コンバータ Apdater クラスは未知のメモリ クラスとインターフェイスを継承します。このとき、Apdater クラス
(parent::Rdata() およびparent::Wdata) のアクセス メソッドを直接使用できます。 ()—— PHP でサブクラスが親クラスのメソッドを呼び出す方法)、インターフェイス指定のメソッド
を実装して、同じアクセス メソッドを実現するようにアクセス メソッドを変換します。
方法 3: インターフェースを継承 (実装) する点を除き、方法 1 と同じです。 -------------------------------------------------- -
/*
[方法 1]
*/
/*
class unknow{
function __construct(){
echo "
私は地球上の人々には知られていない異星人のストレージです: ";
}
function Rdata(){
echo "今読んでいます...
";
}
function Wdata(){
echo "今書いています...
" ;
}
}
class Adpater extends readandwrite{
private $obj;
function __construct(unknow $x){
$this->obj=$x;
function read(){
$this->obj->Rdata();
}
関数 write(){
$this->obj->Wdata(); >}
}
*/
//-------------------------- -------- ----------------------------------
/*
[メソッド 2]
クラスunknow{
function __construct(){
echo "
私は地球人には知られていない異星人の記憶です。私は地球上の記憶とは異なる記憶を持っています。アクセス方法: < /font>
";
}
function Rdata(){
echo "今読んでいます...
";
}
function Wdata( ){
echo "今書いています...
";
}
}
クラス Adpater は、readandwrite を拡張します {
関数 read(){
親::Rdata();
}
関数 write(){
親::Wdata();
}
}
*/
//--- -------------------------------------- ----------- -------------------
/*
【方法 3】
*/
class unknow{
function __construct(){
echo "私は地球上の人々に知られていない異星人のストレージです。私は地球上のストレージとは異なるアクセス方法を持っています: < /font>
"; }
function Rdata(){
echo "今読んでいます...
";
}
function Wdata(){
echo "今書いています...
";
}
}
class Adpater 実装 readandwrite{
private $obj;
function __construct(unknow $x){
$this-> ;obj=$x;
}
関数 read(){
$this->obj->Rdata( );
関数 write(){
$ this->obj->Wdata();
}
}
//[プログラム本体呼び出し]
echo "オブジェクト指向プログラミング - インターフェイス
";
$storage1=new flash( );
$computer=new motherboard($storage1);
$computer ->read();
$computer->write();
$computer=新しいマザーボード($storage2); ;read();
$computer->write();
$computer=新しいマザーボード($storage3); ();
$computer->write();
$un_storage=新しいアダプター($un_storage); );
$computer->read();