インターフェースと抽象クラスの違い、インターフェース抽象クラスの違い_PHPチュートリアル

WBOY
リリース: 2016-07-12 08:53:00
オリジナル
912 人が閲覧しました

インターフェースと抽象クラスの違い、インターフェースと抽象クラスの違い

インターフェースと抽象クラスの違いは何ですか

インターフェイスと抽象クラスの使用を選択する根拠は何ですか?


インターフェースと抽象クラスの概念は異なります。インターフェイスはアクションの抽象化であり、抽象クラスはソースの抽象化です。

抽象クラスは、このオブジェクトが何であるかを表します。インターフェイスは、このオブジェクトができることを表します。たとえば、男性と女性、これら 2 つのクラス (クラスであれば...)、その抽象クラスは人々です。彼らは皆人間であると説明してください。

人も食べることができ、犬も食べることができます。「食べる」をインターフェースとして定義し、これらのクラスに実装させます。

そのため、高級言語では、クラスは 1 つのクラス (抽象クラス) しか継承できませんが (人が同時に生物であると同時に無生物になることができないのと同じです)、複数のインターフェイス (食べること) を実装できます。インターフェイス、ウォーキングインターフェイス)。

http://hovertree.com/h/bjaf/to3l3tjm.htm

いくつかの言葉で要約すると:

1. 抽象クラスもインターフェイスも直接インスタンス化することはできません。インスタンス化する場合、抽象クラス変数はすべての抽象メソッドを実装するサブクラス オブジェクトを指し、インターフェイス変数はすべてのインターフェイス メソッドを実装するクラス オブジェクトを指す必要があります。

2. 抽象クラスはサブクラスによって継承され、インターフェイスはクラスによって実装される必要があります。

3. インターフェースはメソッド宣言にのみ使用できますが、抽象クラスはメソッド宣言とメソッド実装に使用できます

4. インターフェースで定義される変数はパブリック静的定数のみであり、抽象クラスの変数は通常の変数です。

5. 抽象クラス内のすべての抽象メソッドは、サブクラスによって実装される必要があります。サブクラスが親クラスのすべての抽象メソッドを実装できない場合、サブクラスは抽象クラスのみになります。同様に、クラスがインターフェイスを実装する場合、すべてのインターフェイス メソッドを実装できない場合、そのクラスは抽象クラスのみになります。

6. 抽象メソッドは宣言のみ可能であり、実装はできません。インターフェイスは設計の結果であり、抽象クラスは再構築の結果です。

7. 抽象クラスには抽象メソッドは存在できません

8. クラスに抽象メソッドがある場合、このクラスは抽象クラスのみになります

9. 抽象メソッドは実装する必要があるため、静的またはプライベートにすることはできません。

10. インターフェースは複数のインターフェースを継承できますが、クラスは単一のルートからのみ継承できます。

リーリー リーリー


物事の本質に焦点を当てる場合は、抽象クラスを使用し、操作に焦点を当てる場合は、インターフェイスを使用します。

抽象クラスにはインターフェイスよりもはるかに多くの機能がありますが、抽象クラスを定義するコストは高くなります。高級言語では (そして実際の設計の観点からは)、各クラスは 1 つのクラスしか継承できないためです。このクラスでは、そのすべてのサブクラスの

を継承するか、書き出す必要があります。

すべての共通点。インターフェイスの機能は大幅に低下しますが、これはアクションの説明にすぎません。また、1 つのクラスに複数のインターフェイスを同時に実装できます。設計段階での難易度は軽減されます。

インターフェースの使用方法

インターフェース: インターフェース

PHP では、インターフェイスを使用して、オブジェクトが持つべきパブリック外部操作を指定できます。

パブリックメソッドはインターフェースです。オブジェクトがどのパブリック操作メソッド (インターフェイス) に使用されるかを指定するために使用されます。これは、インターフェイス (パブリック操作メソッドのコレクション)

、つまり、インターフェイス (インターフェイス構造、パブリック メソッドのコレクション) とも呼ばれます。
パブリックメソッド(インターフェースメソッド)
定義:インターフェース(インターフェース)と呼ばれる、オブジェクトが持つ必要があるパブリック操作メソッドを制限するために使用される構造

構文:インターフェース構造を定義するには、interfaceキーワードを使用します。インターフェイスで定義されているのは、いくつかのパブリック メソッドです。



注:

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(); では、抽象クラスをどのように使用すればよいでしょうか?最も重要な点は、抽象クラスはインスタンス オブジェクトを生成できないため、直接使用できないことです。クラスを介してインスタンス化されたオブジェクトを使用しているため、抽象クラスを直接使用することはできません。インスタンスオブジェクトを生成するために抽象クラスを宣言するのはどうですか?抽象クラスをオーバーロードするためのテンプレートとして抽象メソッドを使用します。抽象クラスの定義は、サブクラスが抽象クラスを継承した後、サブクラスのニーズに応じて実装される仕様を定義することと同じです。 。サブクラスは親クラスのすべての抽象メソッドを実装する必要があります。そうしないと、サブクラスにまだ抽象メソッドが存在するため、サブクラスは抽象クラスのままでインスタンス化できません。なぜ、抽象クラスから継承する必要があるのでしょうか。いくつかの関数を実装したい場合は、抽象クラスから継承する必要がある場合があります。そうしないと、これらの関数を実装できなくなります。抽象クラスを継承する場合は、そのクラスに抽象メソッドを実装する必要があります。

単一ケースパターン

  1. 单例模式(职责模式):  
  2. 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务;  
  3. 单例类:  
  4. 1、构造函数需要标记为private(访问控制:防止外部代码使用new操作符创建对象),单例类不能在其他类中实例化,只能被其自身实例化;  
  5. 2、拥有一个保存类的实例的静态成员变量  
  6. 3、拥有一个访问这个实例的公共的静态方法(常用getInstance()方法进行实例化单例类,通过instanceof操作符可以检测到类是否已经被实例化)  
  7. 另外,需要创建__clone()方法防止对象被复制(克隆)  
  8. 为什么要使用PHP单例模式?  
  9. 1、php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源。  
  10. 2、如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分。  
  11. 3、在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo。  
  12. 代码实现:
  1. /1**  
  2. * 设计模式之单例模式  
  3. $_instance必须声明为静态的私有变量  
  4. * 构造函数和析构函数必须声明为私有,防止外部程序new  
  5. * 类从而失去单例模式的意义  
  6. * getInstance()方法必须设置为公有的,必须调用此方法  
  7. * 以返回实例的一个引用  
  8. * ::操作符只能访问静态变量和静态函数  
  9. new对象都会消耗内存  
  10. * 使用场景:最常用的地方是数据库连接。   
  11. * 使用单例模式生成一个对象后,  
  12. * 该对象可以被其它众多对象所使用。   
  13. */

 

<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

www.bkjia.comtruehttp://www.bkjia.com/PHPjc/1125681.htmlTechArticle接口与抽象类的区别,接口抽象类区别 接口和抽象类有什么区别 你选择使用接口和抽象类的依据是什么? 接口和抽象类的概念不一样。接...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!