1、継承の定義
継承の意味:あなたは、これらの機能は、元のクラスの場合を拡張書き換えることなく、既存のクラスのすべての機能を使用することができます。
(1)「サブクラス」または呼ば継承によって新しいクラスの作成「派生クラス」を
(2)クラスは、「基底クラス」、「親」と呼ばれる、またはされ継承「スーパークラス」。
一般から特定のプロセスに、ある連続プロセス。継承を達成するために、「継承」(継承)と「組み合わせ」(組成物)によって達成することができます。
特定のOOP言語では、サブクラスは、基本クラスの複数の継承します。しかし、通常の状況下では、サブクラスは、多重継承によって達成することができ、複数の継承を実装するための唯一の基本クラスを持つことができます。
2、継承された分類
継承、インターフェースの継承:継承の概念の実装は、主に2種類あります。
(1)実装継承せずに符号化された追加の特性と基本クラスのメソッドの能力を指します。
(2)インタフェースの継承の名前は、属性および方法であるが、サブクラスは(親サブクラス再構成法)を実装する能力を提供しなければなりません。
継承の使用を考慮すると、一つのことは、2つのクラス間の関係が関係「の一部」であることを注意します。
抽象クラスは、サブクラスだけで作成された一般的なプロパティとメソッドを定義します。
おおよそOO開発パラダイム:設計および実装段階で階層構造(継承及び合成)実施例→クラスとして編成抽象クラス分割→→オブジェクトクラス。
図3に示すように、サンプルコード
#!は/ usr / binに/ ENVパイソン
# - * - コーディング:UTF-8 - * -
#著者:ZhengzhengLiu
#クラスの継承
classPeople:
def__initの__(自己、氏名、年齢):
self.name =名前
self.age =年齢
敗北(自己):
印刷( "%sが食べている..." %のself.name)
defsleep(自己):
印刷( "%sが眠っている..." %のself.name)
deftalk(自己):
印刷( "%sは話している..." %のself.name)
classMan(ピープル):#クラスは親クラスの人々を継承
defmake_money(自己):
印刷( "%sはお金を作っている..." %のself.name)
defsleep(自己):
People.sleep(自己)親クラスのメソッドの#拡張子
印刷(「男が眠っています...」)
classWomen(ピープル):
defshop(自己):
印刷( "%sはショッピングです..." %のself.name)
M1 =マン( "ジャック"、 "20")
m1.eat()
m1.make_money()
m1.sleep()
W1 =女性( "エイミー"、 "25")
w1.talk()
w1.shop()
#結果:
Jackiseating ...
お金をJackismaking ...
Jackissleeping ...
manissleeping...
Amyistalking ...
Amyisshopping ...
図4に示すように、サブクラスは親クラスのコンストラクタの2つのメソッドを再構成します
#!は/ usr / binに/ ENVパイソン
# - * - コーディング:UTF-8 - * -
#著者:ZhengzhengLiu
#クラスの継承
#class人々:#1クラシック
classPeople(オブジェクト):#新しいスタイルのクラス
def__initの__(自己、氏名、年齢):
self.name =名前
self.age =年齢
敗北(自己):
印刷( "%sが食べている..." %のself.name)
defsleep(自己):
印刷( "%sが眠っている..." %のself.name)
deftalk(自己):
印刷( "%sは話している..." %のself.name)
classMan(ピープル):#クラスは親クラスの人々を継承
def__initの__(自己、名前、年齢、お金):
コンストラクタの#People .__のinit __(自己、名前、年齢)#(方法A)再構成ではなく、親クラス属性を追加
コンストラクタを再構築するスーパー(男、自己).__のinit __(名前、年齢)#(方法2)(新規クラスが書かれた)スーパーを使用して
self.money =お金
印刷( "%sを持っているお金の%sの$" %(self.name、self.money))
defmake_money(自己):
印刷( "%sはお金を作っている..." %のself.name)
defsleep(自己):
People.sleep(自己)親クラスのメソッドの#拡張子
印刷(「男が眠っています...」)
classWomen(ピープル):
defshop(自己):
印刷( "%sはショッピングです..." %のself.name)
M1 =マン( "ジャック"、 "20"、10)
m1.eat()
m1.make_money()
m1.sleep()
W1 =女性( "エイミー"、 "25")
w1.talk()
w1.shop()
#結果:
ジャックはmoney10 $を持っています
Jackiseating ...
お金をJackismaking ...
Jackissleeping ...
manissleeping...
Amyistalking ...
Amyisshopping ...
5、多重継承
#!は/ usr / binに/ ENVパイソン
# - * - コーディング:UTF-8 - * -
#著者:ZhengzhengLiu
#クラスの継承
#class人々:#1クラシック
classPeople(オブジェクト):#新しいスタイルのクラス
def__initの__(自己、氏名、年齢):
self.name =名前
self.age =年齢
self.friends = []
敗北(自己):
印刷( "%sが食べている..." %のself.name)
defsleep(自己):
印刷( "%sが眠っている..." %のself.name)
deftalk(自己):
印刷( "%sは話している..." %のself.name)
classRelationship(オブジェクト):
defmake_friends(自己、OBJ):
印刷( "%sは%sのと友達を作っている" %(self.name、obj.name))
self.friends.append(OBJ)
classMan(人々、関係):#多重継承
def__initの__(自己、名前、年齢、お金):
コンストラクタの#People .__のinit __(自己、名前、年齢)#(方法A)再構成ではなく、親クラス属性を追加
コンストラクタを再構築するスーパー(男、自己).__のinit __(名前、年齢)#(方法2)(新規クラスが書かれた)スーパーを使用して
self.money =お金
印刷( "%sを持っているお金の%sの$" %(self.name、self.money))
defmake_money(自己):
印刷( "%sはお金を作っている..." %のself.name)
defsleep(自己):
People.sleep(自己)親クラスのメソッドの#拡張子
印刷(「男が眠っています...」)
classWomen(人々、関係):#多重継承
defshop(自己):
印刷( "%sはショッピングです..." %のself.name)
M1 =マン( "ジャック"、 "20"、10)
W1 =女性( "エイミー"、 "25")
m1.make_friends(W1)
w1.name = "劉"
印刷(m1.friends)
#結果:
ジャックはmoney10 $を持っています
Jackismaking friendswithAmy
[<__ __メイン。女性はオブジェクトat0x0057FA30>]
6、新しいクラスの継承とクラシックの順序
#!は/ usr / binに/ ENVパイソン
# - * - コーディング:UTF-8 - * -
#著者:ZhengzhengLiu
クラスA(オブジェクト):#新しいスタイルのクラス
def__initの__(自己):
印刷( "A")
ClassBの(A):
def__initの__(自己):
印刷( "B")
クラスC(A):
def__initの__(自己):
印刷( "C")
classD(B、C)。
def__initの__(自己):
パス
#print( "D")
OBJ = D()
7、継承の例 - 学校、教師と生徒
#!は/ usr / binに/ ENVパイソン
# - * - コーディング:UTF-8 - * -
#著者:ZhengzhengLiu
#継承インスタンス(新しいクラス) - アナログ・学校、教師と生徒
classSchool(オブジェクト):
def__initの__(自己、名前、ADDR):
self.name =名前
self.addr = ADDR
self.students = []
self.stuffs = []
defenroll(自己、stu_obj):#学生の登録
印刷( "%sの学生登録のための" %stu_obj.name)
self.students.append(stu_obj)
defheir(自己、staff_obj):#は、教師を雇います
印刷(%のstaff_obj.name "教師%sのを雇います")
self.stuffs.append(staff_obj)
classSchoolMember(オブジェクト):
def__initの__(自己、名前、年齢、性別):
self.name =名前
self.age =年齢
self.sex =セックス
deftell(自己):
パス
classTeacher(SchoolMember):
def__initの__(自己、名前、年齢、性別、給与、もちろん):
スーパー(教師、自己).__のinit __(名前、年齢、性別)
self.salary =給与
self.course =コース
deftell(自己):
印刷(「」」
-----先生の情報:%sの-----
名前:%sの
年齢:%sの
セックス:%sの
給与:%sの
コース:%sの
'' '%(self.name、self.name、self.age、self.sex、self.salary、self.course))
defteach(自己):
印刷( "%sはコースを教えている[%S]" %(self.name、self.course))
classStudent(SchoolMember):
def__initの__(自己、名前、年齢、性別、stu_id、グレード):
スーパー(学生、自己).__のinit __(名前、年齢、性別)
self.stu_id = stu_id
self.grade =グレード
deftell(自己):
印刷(「」」
-----学生の情報:%sの-----
名前:%sの
年齢:%sの
セックス:%sの
Stu_id:%sの
グレード:%sの
'' '%(self.name、self.name、self.age、self.sex、self.stu_id、self.grade))
defpay_tuition(自己、金額):
印刷(、量を%(self.name "%sは$%sのための授業料をpaiedました"))
#インスタンス化
学校=学校(「清華」、「北京」)
T1 =教師( "ジャック"、 "30"、 "M"、 "20000"、 "パイソン")
T2 =教師( "エイミー"、 "28"、 "F"、 "15000"、 "Linuxの")
S1 =学生( "劉"、 "23"、 "M"、 "1701"、 "パイソン")
S2 =学生( "王"、 "25"、 "F"、 "1702"、 "Linuxの")
#情報を表示コール生徒と教師
t1.tell()
s1.tell()
school.heir(T1)#t1のレンタル教師
school.enroll(S1)#s1の学生登録
school.enroll(S2)
印刷(school.stuffs)
印刷(school.students)
#まず教師が教えるために雇わ
school.stuffs [0] .teach()
forstuinschool.students:
stu.pay_tuition(5000)
#結果:
-----先生の情報:ジャック-----
名前:ジャック
年齢:30
セックス:M
給与:20000
コース:パイソン
-----学生の情報:劉-----
名前:劉
年齢:23
セックス:M
Stu_id:1701
グレード:パイソン
教師はジャックを雇っ
登録のための劉の学生
登録のための王の学生
[<__ __メイン。先生オブジェクトat0x0059FDB0>]
[<__ __メイン。学生対象at0x0059FDF0>、<__ __メイン。学生対象at0x0059FE10>]
Jackisteachingもちろん[パイソン]
劉さんは$ 5000 tuitionfor paiedました
王は$ 5000 tuitionfor paiedました
図8に示すように、多型(polymorphisn) - インタフェース、種々の形態
(1)定義
あなたは親オブジェクトが等しくなる設定と彼のサブオブジェクト技術の一つ以上を可能にする多型(polymorphisn)、
この割り当ての後、親オブジェクトは、その子オブジェクトに割り当てられた現在の特性に応じて異なる方法で動作することができます。
単に一つの文章で、置く:親クラスのポインタ型へのサブクラス型ポインタの割り当てを可能にします。
多型の役割は:我々は、パッケージは、実装の詳細、そのようなモジュラーコードを隠すことができる知っている。継承拡散コードモジュール(s)は存在していてもよい;その目的は、である - コードの再利用。
インターフェイスの再利用を - 多型が実現することを目的とします!ポリモーフィックな役割は、正しい呼び出したときに、クラスの任意のインスタンスのプロパティを確認し、クラス継承と派生時間にある「家系図。」
Pyhon多くの多型の構文は、このようなソートLEN()、()のように、サポートされている、あなたはそれがリストの転送長のリストを返し、LENの文字列は、文字列の長さを返し渡します。
(2)サンプルコード:
#!は/ usr / binに/ ENVパイソン
# - * - コーディング:UTF-8 - * -
#著者:ZhengzhengLiu
classAnimal(オブジェクト):
def__initの__(自己、名):
self.name =名前
deftalk(自己):
raiseNotImplementedError(「サブクラスの抽象メソッドを実装する必要があります」)
ポリモーフィズムの# - インタフェース、様々な形態
@staticmethod
defanimal_talk(OBJ):
obj.talk()
classCat(動物):
deftalk(自己):
印刷( "%sのニャー!" %のself.name)
classDog(動物):
deftalk(自己):
印刷( "%sのウーフ!ウーフ!" %のself.name)
D =犬( "A")
#1 d.talk()
C =キャット( "B")
#1 c.talk()
#多型
Animal.animal_talk(D)
Animal.animal_talk(C)
#結果:
ウーフ!横糸!
Bニャー!
9、武器オブジェクト指向設計 - ドメインモデリング
(1)定義
ドメインモデルの当初から、我々はオブジェクト指向する分析と設計プロセスを開始し、我々は言うことができ、ドメインモデルは、オブジェクト指向設計を橋渡しするための要件分析から完了です。
ドメインモデルは、定義により、関連するモデリング要件の分野で、引数がより人気のビジネスモデルです。
(2)ドメインモデルは、2つの主要な機能を有します。
重要な概念のビジネスを探ります
ビジネスの概念間の関係を確立します
(3)3つの文字フィールドモデリング
ドメインモデルは、分析および精製が含まれ、ドメインモデリング手法をまとめたものが、このような操作用語を検索しても、単純な!「名詞を見つけるために、」されて非常に重要である、簡単にでき拾い出しのではなく、
この場合は、アナリストやデザイナーの経験とスキルが便利になることができます。しかし、分析はまた、ドメインモデルには、少なくとも使用可能なドメインモデルを完成するために、さえ経験と優れたスキルの富ずに、比較的簡単ですありません。
重要な問題:フィールドは「需要するオブジェクト指向ブリッジ」であるため、モデルを見つけるためには、具体的には、ユースケースから見つけることです、需要モデルから見ると:?と考えることができます。
要約:ドメインモデリング手法は、「ユースケースから名詞を見つける。」ことです もちろん、オブジェクト指向の要件と特性を持つ、より一貫性があるために、名詞を見つけた後。
プロパティ、でも関係を追加します。我々はまた、さらにこれらの条件を改善する必要があり、これが次のステップです!
、名詞を見つける属性を追加、でも関係:最後に、我々は3つの文字ドメインモデリング手法と結論付けています。