25
OO

20150112-OO基礎

Embed Size (px)

Citation preview

Page 1: 20150112-OO基礎

OO

Page 2: 20150112-OO基礎

Object-oriented物件導向面向對向

Page 3: 20150112-OO基礎

OO基本特性封裝(Encapsulation)繼承(Inheritance)多型(Polymorphism)

Page 4: 20150112-OO基礎

封裝(Encapsulation)privateprotectedpublic少用萬惡friend沒說你能用你不能用

Page 5: 20150112-OO基礎

繼承(Inheritance)

Page 6: 20150112-OO基礎

在開始繼承之前....staticabstractvirtualoverriding順便講一下名字很像的overloading

Page 7: 20150112-OO基礎

static class無法用new 生成程式初始時就會被生成(時機不同語言不同)只包含靜態成員

Page 8: 20150112-OO基礎

static member不需要new也可以使用static method 亦同所以static method不能直接call non-static method

Page 9: 20150112-OO基礎

abstractabstract classabstract method

Page 10: 20150112-OO基礎

abstract class抽象class不能被用來生成物件,它只能被擴充(繼承)換言之你不能new 一個abstract class

Page 11: 20150112-OO基礎

abstract method一定要被子類別override無實作方法

Page 12: 20150112-OO基礎

virtual method(C++/C#)可以被子類別override(非必須)可以有實作方法更確切說,希望子類別override如果你寫Java,恭喜你

“ In Java, all non-static methods are bydefault "virtual functions." Only methods

marked with thekeyword final, whichcannot be overridden, along with private

methods, which are not inherited, arenon-virtual.

Page 13: 20150112-OO基礎

通常.....abstract跟virtual 用於定義base class但這只是通常,很多設計會違反這又是另外一個故事了,等以後再說

Page 14: 20150112-OO基礎

Overriding子類別覆寫父類別的函式函式名稱相同傳入參數相同回傳類別相同

Page 15: 20150112-OO基礎

Overloading相同函式名稱不同的參數數量

Page 16: 20150112-OO基礎

繼承(Inheritance)抽象化的手段子類別可以繼承父類別的能力直接使用父類別non private的屬性和方法

Page 17: 20150112-OO基礎

繼承的重點B 繼承 AB 一定要是A,但A不一定要是B

這不是鐵則,有時候也會違反

但這是一個判斷有沒有濫用繼承的重要指標

Page 18: 20150112-OO基礎

多型(Polymorphism)這個難搞了....一句話說完可以用父類別的指標執行子類別的特異化實作

Page 19: 20150112-OO基礎

還是直接看例子吧

Page 20: 20150112-OO基礎

來談談多重繼承

Page 21: 20150112-OO基礎

多重繼承一個子類別繼成多個父類別用不好會有很多問題(如鑽石繼承如果你寫C#/JAVA恭喜你不用關心這問題他們用一種超神的方法解決了多重繼承難題

Page 22: 20150112-OO基礎

就是根本不給你多重繼承

Page 23: 20150112-OO基礎

當上帝為你關起一扇門

同時也會為你開啟另一扇窗

Page 24: 20150112-OO基礎

Interface為了避免程度不好的PG亂用多重繼承(誤可以想成只有abstract method 的 abstract class只定義了方法C#中interface 也可以定義property

Page 25: 20150112-OO基礎

duck typing當看到一隻鳥走起來像鴨子、游泳起來像鴨子、叫起來也像鴨子,那麼這隻鳥就可以被稱

為鴨子。

PythonC#4.0 (dynamic)