[物件導向Ep. 1] 類別與物件 - CodiMD
文章推薦指數: 80 %
會建議使用C++ 或是Java 當作基底語言去學習,C++ 的原因是他有完整的物件導向特性;Java 也有(甚至有時候還比C++ 更好理解些),只是他的開發環境比較囉嗦;Python 本身是 ...
5197views
#[物件導向Ep.1]類別與物件
######tags:`MCL``oop`
Declaration
~此系列內容強調物件導向的部分,因此不會參雜太多語法介紹。
會建議使用C++或是Java當作基底語言去學習,C++的原因是他有完整的物件導向特性;Java也有(甚至有時候還比C++更好理解些),只是他的開發環境比較囉嗦;Python本身是全物件導向,但是他有部分類別操作是比較複雜的,所以只會帶一些簡單的例子輔佐。
##前言
物件導向程式設計(ObjectOrientedProgramming,OOP)是一種概念,他傳達著說當我們在操作一團變數與方法的時候,可以朝向著
-把**相關的變數與方法們封裝成一個「東西」**,讓使用者**透過這個東西去操作這些內容物**(可能是變數或是函數方法)。
-當兩種不同的類型有強烈的歸屬關係,如「水」跟「熱水」,時,「熱水」**可以透過某種方式繼承「水」那邊的內容物**(比如測量公升數方法之類的),**而不用自己重寫**。
-且當**多種不種類型有共同的歸屬關係**,如「貓」跟「狗」都是「動物」,「動物」都有叫聲,時,可以**透過某種途徑對每個東西呼叫一樣的函數,但是呈現出不一樣的行為**。
一個經典的例子是:貓的叫聲是「喵」,而狗的叫聲是「汪」,但他們都是動物的叫聲。
這些行為可以幫助我們增強程式碼的結構性,並且減少了程式碼的重複性。
而實現上面三種行為的基本元素,就是類別(Class)與物件(Object)。
###類別與物件的關係
![](https://hackmd.mcl.math.ncu.edu.tw/uploads/upload_fbb39fdb4e4641952c8fa95647f869ed.png)
>[name=[WhatisObjectOrientedProgramming(OOP)](https://javatutorial.net/java-oop)]
上圖是一個有趣的例子,他很簡要地說明了類別跟物件的關係。
一言蔽之,
-類別(Class)是**架構定義**,
-物件(Object)是**根據架構宣告出來的變數**。
類別與物件的好處在於可以把其相關的方法包裝在物件(變數)當中,而不用特別在外部設計函數,避免還要花功夫理解物件內部到底是怎麼運作的。
###案例
舉例來說,在C++當中,
```cpp=
std::stringfoo("Alice");
std::cout<
另外一個例子,來看Python3:
```python=
foo=str('Alice')
print(foo.startswith('A'))#string`foo`startswith'A'
```
同樣地概念,
-`
惟因為Python採動態型別(宣告變數的時候不需要指派型態),所以你需要用`type(foo)`去查看他的當前型態。
-而`foo`是生成出來的物件(變數),並且在建立的時候把`"Alice"`字串作為其內部值。
-`startswith()`是包裝在`foo`物件裡面的一個方法(函數),他會檢查該字串是不是由某個字串當起頭。
-你不會看到`startswith`方法內部的處理方式,他已經包裝起來了(封裝Encapsulation)。
###支援物件導向的語言
在文章開頭處有提到,物件導向本身是一種概念,所以你有機會在不同的語言看到相似的用法,不同之處可能只在於語法,或者是內部一些細微的差異。
現在大多數的語言都支援物件導向程式設計模式:
-C++
-Java
-Python2/3
-JavaScript(ES6^)
-PHP
-Ruby
-Kotlin
-etc.
不過也有一些語言是不支援這種模式的,如:
-C
-Golang(GoLanguage)
>他們也有自己的包裝方法:結構(Structure),但他是弱化的類別,沒有物件導向的特性。
>```c=
>//cstructure
>structstudent{
>charname[10];
>intage;
>};
>typedefstructstudentstudent;
>```
>```go=
>//golangstructure
>typeStudentstruct{
>namestring
>ageint
>};
>```
##類別的用法
從上面的鋪陳中,你依稀會發現一個類別應該涵蓋一些項目:
*裡面有一些變數和一些方法,我們會把他們稱為成員變數跟成員方法。
*更細節的來說,你可能會希望有些成員不能讓物件外直接取用(比如一個字串儲存貓叫聲的變數)。
*在物件生成的時候,你可以把傳進來的值做些處理,比如把值`"Alice"`儲存到內部的某個變數當中。
我們會用一個函數包裝裡面的動作,這個函數有一個特殊的名詞叫建構子(Constructor)。
了解這些需求後,我們直接看範例:
-C++
```cpp=
#include
從上述例子(C++)當中,`saySomething()`是公開成員,所以你可以使用
```cpp
Catc1("Alice");
c1.saySomething();
```
去使用他的功能。
但`name`跟`barking`是私有成員,所以當你做以下任何動作時都會發生錯誤:
```cpp
Catc1("Alice");
cout<
但一般程式還是有可能需要存取變數值的需求,但你的選擇不會是把變數放到公開去,這意味著該值可以被使用者任意修改。
相對地,針對一個變數,我們會傾向另外開兩個函數空該分別進行取值(Getter)跟賦值(Setter)行為。
以`name`為例,我們可以這麼做:
```cpp=
classCat{
public:
//...
stringgetName(){
returnthis->name;
}
voidsetName(stringname){
if(name.length()>10){
cerr<name=name;
}
private:
stringname;
};
```
接著你就可以透過存取`Cat`物件中的`name`成員變數:
```cpp
Catc1("Alice");
cout<
延伸文章資訊
- 1類別設計工具中的C++ 類別- Visual Studio - Microsoft Learn
瞭解C++ 類別及其支援方式,以及在類別設計工具中可以有多個繼承關聯性。
- 2[物件導向Ep. 1] 類別與物件 - CodiMD
會建議使用C++ 或是Java 當作基底語言去學習,C++ 的原因是他有完整的物件導向特性;Java 也有(甚至有時候還比C++ 更好理解些),只是他的開發環境比較囉嗦;Python 本身是 ...
- 3定義類別
從C 背景來的開發者可能會想,這種風格像是C 的結構(struct),在C++ 中, struct 也被視為定義類別,將以上的 class 關鍵字換為 struct ,程式也可以運作, stru...
- 4C++ 類型系統
類型的一些範例包括 int 儲存整數值、 double 儲存浮點值(也稱為純量資料類型) ,或標準程式庫類別std::basic_string 來儲存文字。 您可以藉由定義 ...
- 5C++ 類別class 簡介 - 程式語言教學- 痞客邦
C++完整教學目錄> * 朋友們若是覺得本教學對您有幫助,請點個讚~ 類別(class)和結構(struct)很相像,是用來改善結構在使用上容易出現的.