参考リンク:https://www.cnblogs.com/weihengblog/p/8528967.html
A、抽象クラスとインタフェースクラス
継承二つの目的:
A:基本クラスの継承の方法、および独自の変更や拡張を行う(コードの再利用)
IIは:サブクラスは、インタフェースクラスインターフェースを定義し、特定の基底クラスと互換性がある宣言、インタフェースクラスは、インターフェース名を定義し(ている、関数名)とインタフェース機能、サブクラス継承インタフェースクラスを実装し、インターフェイスを実装しませんでした機能。
実際には、最初の意味は非常に重要な、そしてしばしば有害ではない継承されました。それは基本クラスを可能にし、サブクラス強い結合が発生するため。
継承されて第2の意味は非常に重要です。また、「インターフェイスの継承」と呼ばれています。
このプログラミングで-インターフェイスの継承は、本質的に必要とされる「外部の発信者が細部を気にしないことができます互換性のあるインターフェースを提供し、良好な抽象化を、作るために、特定のインターフェイスのすべてのオブジェクトの非差別的取扱いを達成することができます」正規化と呼ばれます。
1.メイク良い抽象クラス、2規定互換インターフェース3.呼び出し側が、特定の実装の詳細を気にしないことがあり、同じように特定のインターフェイスのすべてのオブジェクトを扱う達成することができます。
#良い抽象作る クラスの支払い(オブジェクト): #は、互換性のあるインターフェースを提供 DEFペイ(セルフ): パス #マイクロチャネルの有料 クラスWeChatPay(オブジェクト): DEFペイ(セルフ、マネー): 印刷(「マイクロチャネル支払っ% S '%マネー) #アリペイ クラスアリペイ(オブジェクト): DEF有料(自己、マネー): 印刷(' %S「%お金のアリペイ決済) #アップルの有料 クラスApplePay(オブジェクト): DEF有料(自己、マネー) : 印刷( 'Appleが支払わS%' %マネー) DEF賃金(OBJ、マネー): obj.pay(金) Weixin = WeChatPay() アリペイ=アリペイ() applepay = ApplePay() 特定の実装の詳細を気にすることなく#発信者、治療が等しく、特定のインタフェースのすべての目的を達成することができる 有料(Weixin、100) 支払い(Alipayの、200である)を 有料(applepay、300)
ハイレベルの外部ユーザーが無差別にすべてのインタフェースオブジェクトの互換性のあるセットを処理することはできませんので、正規化 - のような、パン・ファイルのLinuxの概念かのように、すべてがファイルハンドルすることができ、それはメモリ、ディスク、ネットワークを心配する必要はありません。またはスクリーン(もちろん、基礎となる設計者は、当然のことながら、「キャラクタデバイス」と「ブロックデバイス」を区別して、ターゲットデザインを作ることができます。詳細をどの程度に、需要に応じて)。
1
2
|
依赖倒置原则:
高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该应该依赖细节;细节应该依赖抽象。换言之,要针对接口编程,而不是针对实现编程
|
第二に、抽象クラス
抽象クラスとは何ですか
Javaのと同じように、Pythonはまた、抽象クラスの概念を持っていますが、またモジュールの実装の援助を必要とする、抽象クラスはインスタンス化できない、それは特別なことが唯一継承することができている、特別なクラスであります
なぜべき抽象クラス
場合クラスが由来するのパイルオブジェクト、同じコンテンツから抽出された抽象クラスはからのパイルクラスデータ属性および機能属性を含む同一のコンテンツから抽出します。
たとえば、私たちは、同じコンテンツを抽出するクラスの桃は、あなたが果物を食べるか、特定のバナナを食べて、いずれかの特定を食べたときに、これらのクラスから、この抽象クラスの果実は、あるある、バナナのカテゴリ、Appleのクラスを持っています桃。。。。。。あなたは果物と呼ばれるものを食べることはできません。
実際のオブジェクトが来るからクラスが抽象化があるならば、抽象クラスは、クラスベースの抽象来ている、設計の観点から参照してください。
実装の観点からは、その一般的なカテゴリ内の抽象クラスと異なっている:抽象クラス抽象メソッド、クラスは、インスタンス化することはできません継承することができ、およびサブクラスは抽象メソッドを実装する必要があります。このインタフェースはやや似ていますが、実際には異なっている、答えを明らかにしようとしています
Pythonで抽象クラス
#すべてがファイルである 輸入ABCの#ABCモジュールが実装抽象クラスの使用 :クラスAll_file(メタクラスこと= abc.ABCMeta) all_type =「ファイル」 @ abc.abstractmethod#機能を実現することなく、抽象メソッドを定義する デフ読んで(自己): サブクラスの必須読み込み機能定義された「 パス @#は関数には実装せず、定義された抽象メソッドをabc.abstractmethod DEF書き込み(セルフ): 」書き込み機能は、サブクラスを定義しなければならない パス #クラスtxtが(All_file): #パス # #T1 = txtが()のエラー# 、サブクラスは抽象メソッドを定義していません #サブクラス継承抽象クラスが、読み取りおよび書き込みメソッドを定義する必要があります。クラスのtxtが(All_file)を DEF(自己を)読み: 印刷(「テキストデータは、メソッドを読ん」) DEF書き込み(セルフ): 印刷(「テキストデータは、メソッドを読ん」) クラスSATA(All_file):#サブクラス継承抽象クラスが、読み取りおよび書き込みメソッドを定義する必要があり デフ(自己を)読んで: 印刷(「メソッドを読んで、ハードディスクのデータ」) DEF書き込み(セルフ): プリント(「メソッドを読んで、ハードディスクのデータ」) クラスのプロセス(All_file):#サブクラス継承抽象クラスが、読み取りおよび書き込みメソッドを定義する必要があり DEF読みます(セルフ): ('読み込むメソッドの処理データ')印刷 :DEF書き込み(セルフ) ( 'メソッドの処理データを読み込む')印刷 wenbenwenjian = txtが() yingpanwenjian = SATA() jinchengwenjian =プロセス() 私たちは#をであること、思考のすべてがのファイルで、正規化されている wenbenwenjian.read() yingpanwenjian.write() jinchengwenjian.read() 印刷(wenbenwenjian.all_type) 印刷(yingpanwenjian.all_type) 印刷(jinchengwenjian.all_type)
3つの抽象クラスとインターフェイスを抽象
エッセンスは、データ属性(例えばall_type)特性および機能(例えば、読み取り、書き込み)を含むクラスのセットの類似度を参照して、抽象クラスであり、インターフェースのみ類似度関数属性を強調しました。
正規のデザインを達成するために使用することができるいくつかの機能のクラスとインタフェースと一緒に抽象クラスは、直接およびインターフェースの概念間のクラスです
ないインタフェース定義された特殊なモジュールによって、我々はいくつかの基本的な概念を持っている必要がある場合は、Pythonで、インタフェースクラスのようなものはありません。
1.多重継承の問題
抽象クラスを継承する過程で、我々は多重継承を回避しようとしてください;
および後継インタフェースで、我々は代わりに多重継承インターフェイスにことをお勧めします
インターフェイス分離の原則: 専用のインタフェースに複数の代わりに、単一の一般的なインターフェース。そのクライアントは、これらの不要なインターフェースに依存しないでください。
抽象クラスでは、我々は達成するために、いくつかの抽象メソッドに基づいて行うことができ、
およびインターフェイスクラスで、任意の方法は、単に仕様、特定の機能的なニーズのサブクラス実装であります
1.多重継承の問題 抽象クラスを継承する過程では、我々は多重継承を回避しようとしてください; および後継インタフェースで、我々は代わりのインターフェイスの多重継承することをお勧めします 。2.に方法を達成するために 、我々は抽象抽象クラスで基礎となる実装を製造する方法は、 インタフェースクラスで、任意の方法は、単に仕様、特定の機能のニーズのサブクラス実装であります