インターフェースと抽象クラスの違いは何ですか
インターフェイスと抽象クラスの使用を選択する根拠は何ですか?
インターフェースと抽象クラスの概念は異なります。インターフェイスはアクションの抽象化であり、抽象クラスはソースの抽象化です。
抽象クラスは、このオブジェクトが何であるかを表します。インターフェイスは、このオブジェクトができることを表します。たとえば、男性と女性、これら 2 つのクラス (クラスであれば...)、その抽象クラスは人々です。彼らは皆人間であると説明してください。
人も食べることができ、犬も食べることができます。「食べる」をインターフェースとして定義し、これらのクラスに実装させます。
そのため、高級言語では、クラスは 1 つのクラス (抽象クラス) しか継承できませんが (人が同時に生物であると同時に無生物になることができないのと同じです)、複数のインターフェイス (食べること) を実装できます。インターフェイス、ウォーキングインターフェイス)。http://hovertree.com/h/bjaf/to3l3tjm.htm
いくつかの言葉で要約すると:
1. 抽象クラスもインターフェイスも直接インスタンス化することはできません。インスタンス化する場合、抽象クラス変数はすべての抽象メソッドを実装するサブクラス オブジェクトを指し、インターフェイス変数はすべてのインターフェイス メソッドを実装するクラス オブジェクトを指す必要があります。
2. 抽象クラスはサブクラスによって継承され、インターフェイスはクラスによって実装される必要があります。
3. インターフェースはメソッド宣言にのみ使用できますが、抽象クラスはメソッド宣言とメソッド実装に使用できます
4. インターフェースで定義される変数はパブリック静的定数のみであり、抽象クラスの変数は通常の変数です。
5. 抽象クラス内のすべての抽象メソッドは、サブクラスによって実装される必要があります。サブクラスが親クラスのすべての抽象メソッドを実装できない場合、サブクラスは抽象クラスのみになります。同様に、クラスがインターフェイスを実装する場合、すべてのインターフェイス メソッドを実装できない場合、そのクラスは抽象クラスのみになります。
6. 抽象メソッドは宣言のみ可能であり、実装はできません。インターフェイスは設計の結果であり、抽象クラスは再構築の結果です。
7. 抽象クラスには抽象メソッドは存在できません
8. クラスに抽象メソッドがある場合、このクラスは抽象クラスのみになります
9. 抽象メソッドは実装する必要があるため、静的またはプライベートにすることはできません。
10. インターフェースは複数のインターフェースを継承できますが、クラスは単一のルートからのみ継承できます。
リーリー リーリー
物事の本質に焦点を当てる場合は、抽象クラスを使用し、操作に焦点を当てる場合は、インターフェイスを使用します。
抽象クラスにはインターフェイスよりもはるかに多くの機能がありますが、抽象クラスを定義するコストは高くなります。高級言語では (そして実際の設計の観点からは)、各クラスは 1 つのクラスしか継承できないためです。このクラスでは、そのすべてのサブクラスの
を継承するか、書き出す必要があります。すべての共通点。インターフェイスの機能は大幅に低下しますが、これはアクションの説明にすぎません。また、1 つのクラスに複数のインターフェイスを同時に実装できます。設計段階での難易度は軽減されます。
インターフェースの使用方法
インターフェース: インターフェース
PHP では、インターフェイスを使用して、オブジェクトが持つべきパブリック外部操作を指定できます。
パブリックメソッドはインターフェースです。オブジェクトがどのパブリック操作メソッド (インターフェイス) に使用されるかを指定するために使用されます。これは、インターフェイス (パブリック操作メソッドのコレクション)、つまり、インターフェイス (インターフェイス構造、パブリック メソッドのコレクション) とも呼ばれます。
パブリックメソッド(インターフェースメソッド)
定義:インターフェース(インターフェース)と呼ばれる、オブジェクトが持つ必要があるパブリック操作メソッドを制限するために使用される構造
注:
1. インターフェイスのメソッド、アクセス権はパブリックである必要があります2. インターフェイスにはパブリック メソッドのみが存在でき、メンバー変数は存在できません
3. インターフェイスには、抽象化メソッドとも呼ばれる、実装されていないメソッドのみを含めることができます。ただし、抽象キーワードはありません。
クラスはインターフェースを実装し、キーワードimplementsを使用して完了します。
このように、インターフェイスを実装するクラスは、インターフェイス内のすべての抽象メソッドを実装する必要があります。そして、この方法は公開外部操作方法でなければならないことは確かです。
複数の実装: この関数は理論的には抽象クラスを通じて実装できますが、抽象クラスは専門的ではありません。
PHP は複数の実装をサポートし、単一の継承のみをサポートするため、インターフェイスを使用することは実装の点でより専門的です。
PHPオブジェクトインターフェースのサポート、クラス定数を定義可能、インターフェースの継承も可能
抽象メソッドと抽象クラス
OOP 言語では、クラスは 1 つ以上のサブクラスを持つことができ、各クラスには、
外部コードがアクセスするためのインターフェイスとして少なくとも 1 つのパブリック メソッドがあります。抽象メソッドは継承を容易にするために導入されています。その使用法を説明する前に、まず抽象クラスと
抽象メソッドの定義を見てみましょう。
抽象メソッドとは何ですか?メソッド本体を持たずにクラス内で定義するメソッドは抽象メソッドです。いわゆるメソッド本体とは、メソッドが宣言されるときに中括弧やその中のコンテンツが存在せず、宣言時にメソッド名の直後に存在することを意味します。
抽象メソッドを宣言する場合は、末尾にセミコロンを追加し、キーワード「abstract」を追加します。
例:
abstract function fun2(); "abstract" メソッド本体のない抽象メソッド "fun1()" と "fun2()" を忘れないでください
抽象メソッドの後にはセミコロンもあります。抽象クラスとは何ですか?クラス内に抽象メソッドが存在する限り、そのクラスは抽象クラスとして定義する必要があり、また抽象クラス内で「abstract」キーワードを使用して抽象クラスを変更する必要があります。は抽象属性ではありませんが、1 つのメソッドが抽象メソッドである限り、クラスは抽象クラスとして宣言され、「abstract」で変更される必要があります。
http://hovertree.com/menu/php/
上記の例では、抽象クラス「Demo」が定義され、「abstract」で変更されています。このクラスには、メンバー属性「$test」と 2 つの抽象メソッド「fun1」および「fun2」が定義されています。メソッド fun3(); では、抽象クラスをどのように使用すればよいでしょうか?最も重要な点は、抽象クラスはインスタンス オブジェクトを生成できないため、直接使用できないことです。クラスを介してインスタンス化されたオブジェクトを使用しているため、抽象クラスを直接使用することはできません。インスタンスオブジェクトを生成するために抽象クラスを宣言するのはどうですか?抽象クラスをオーバーロードするためのテンプレートとして抽象メソッドを使用します。抽象クラスの定義は、サブクラスが抽象クラスを継承した後、サブクラスのニーズに応じて実装される仕様を定義することと同じです。 。サブクラスは親クラスのすべての抽象メソッドを実装する必要があります。そうしないと、サブクラスにまだ抽象メソッドが存在するため、サブクラスは抽象クラスのままでインスタンス化できません。なぜ、抽象クラスから継承する必要があるのでしょうか。いくつかの関数を実装したい場合は、抽象クラスから継承する必要がある場合があります。そうしないと、これらの関数を実装できなくなります。抽象クラスを継承する場合は、そのクラスに抽象メソッドを実装する必要があります。
単一ケースパターン
<span>class</span><span> Danli { </span><span>//</span><span>保存类实例的静态成员变量 </span> <span>private</span> <span>static</span> <span>$_instance</span><span>; </span><span>//</span><span>private标记的构造方法 </span> <span>private</span> <span>function</span><span> __construct(){ </span><span>echo</span> 'This is a Constructed method;'<span>; } </span><span>//</span><span>创建__clone方法防止对象被复制克隆 </span> <span>public</span> <span>function</span><span> __clone(){ </span><span>trigger_error</span>('Clone is not allow!',<span>E_USER_ERROR</span><span>); } </span><span>//</span><span>单例方法,用于访问实例的公共的静态方法 </span> <span>public</span> <span>static</span> <span>function</span><span> getInstance(){ </span><span>if</span>(!(self::<span>$_instance</span><span> instanceof self)){ self</span>::<span>$_instance</span> = <span>new</span><span> self; } </span><span>return</span> self::<span>$_instance</span><span>; } </span><span>public</span> <span>function</span><span> test(){ </span><span>echo</span> '调用方法成功'<span>; } } </span><span>//</span><span> 何问起 hovertree.com //用new实例化private标记构造函数的类会报错 //$danli = new Danli(); //正确方法,用双冒号::操作符访问静态方法获取实例 </span> <span>$danli</span> = Danli::<span>getInstance(); </span><span>$danli</span>-><span>test(); </span><span>//</span><span>复制(克隆)对象将导致一个E_USER_ERROR </span> <span>$danli_clone</span> = <span>clone</span> <span>$danli</span>;
http://www.cnblogs.com/roucheng/p/3528396.html