# OOP筆記 OOP (Object-oriented programming),也稱物件導向程式設計,是基於物件概念的一種程式設計典範,屬於一種抽象的程式開發方針。 >*程式設計典範是軟體工程中的各種典型設計風格的統稱,常見的有函式程式設計 (Functional programming)、以及OOP…等多種典範,每種情況適合的設計典範都不同,並沒有某種典範絕對優於其他種,甚至有某些情況並沒有合適的典範,需要去研發一種新的。根據情況挑選合適的開發方式是程式開發的重點。* OOP的設計風格是將整個系統(或稱程式)塑造成許多物件的集合體,每個物件代表整個系統的特定面向。OOP中,物件作為程式的基本單元,將程式與資料封裝其中,再提供一個端口 (interface),讓物件外的程式可以與其互動,但因其封裝特性,可以維持物件的內部狀態。 --- *範例使用 java程式碼,且為 psuedo code。* - **Class and instance** 在一個OOP風格的系統中,程式設計師會創造一個抽象定義的物件來表示某種存在,這一段描述不太好懂,舉個例子,如果我現在的系統是一所學校,那我會需要一個物件來表示眾多老師們,每位老師有一些共通的屬性,例如: 他們有名字以及專長的學科;可以向學生們自我介紹、批改作業,以下為範例。 第一行替class命名,並在其中添加該class的相關定義。 - **properties**: 該class的基礎屬性 - **constructor**: 建構子,其中是一個建構函式,在一個instance產生時,由建構函式初始化自帶的屬性,該函式通常會跟class同名 - **methods**: 該class的內部函式 ```java // psuedo code class Teacher properties name subjects constructor Teacher(name, subjects) methods grade(paper) introduceSelf() ``` 編寫完就能使用該class來產生instance ```java watson= new Teacher("Watson", "Math"); watson.subjects; // Math watson.introduceSelf(); // My name is Watson and I will be your Math teacher. ``` - **Inheritence** OOP的另一個特性是繼承,透過將某個class的屬性繼承至另一個或多個class,透過此方式來減少重複撰寫程式碼,並提高維護性。 ```java //psuedo code class Person preperties name construtor Person(name) methods introduceSelf() class Teacher : extends Person preperties subjects construtor Teacher(name, subjects) methods grade(paper) introduceSelf() class Student : extends Person preperties year construtor Student(name, year) methods introduceSelf() ``` 在上面的範例中,Person可以稱為Teacher和Student的superclass或parent class;反之,可以稱Teacher是Person的subclass或child class。 introduceSelf之所以要分別各寫一次則是因為,老師和學生的自我介紹方法不同,而Person的introduceSelf則是提供不是老師也不是學生的人一個預設的自我介紹。 ```java watson= new Teacher("Watson", "Math"); watson.introduceSelf(); // My name is Watson and I will be your Math teacher. peter = new Student("Peter", "2"); peter.introduceSelf(); // My name is Peter and I'm in the second year. ashley = new Person("Ashley"); ashley.introduceSelf(); // My name is Ashley. ``` 當一個相同名稱的函式(範例中為introduceSelf),在不同的class中有不同的執行方式,稱為多型(**polymorphism**);當subclass中的同名函式取代為他的superclass中繼承過來的函式,此舉動稱為覆寫 (override)。 - **Encapsulation** 外部程式不能直接訪問物件內部的資料,而是透過物件提供的端口來訪問,以維持物件內部的私有性,稱為封裝。 ```java //psuedo code class Student : extends Person preperties year construtor Student(name, year) methods introduceSelf() canStudyArchery() { return this.year > 1 } ``` ```java if ( peter.canStudyArchery() ){ // allow the student into the class } ``` 若要禁止外部程式訪問物件內部的資料,可以使用private屬性。 ```java class Student : extends Person preperties private year construtor Student(name, year) methods introduceSelf() canStudyArchery() { return this.year > 1 } amy = new Student("Amy", "1") amy.year // error: 'year' is a private property of Student ``` 參考資料: [https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_programming](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_programming) ###### tags: `物件導向`