實戰系列『影像處理軟體設計』- [10] 物件導向方法:實作模型(上)

更新於 發佈於 閱讀時間約 6 分鐘

終於完成物件導向的設計,包括用於指導撰寫程式的「類別模型」和「動態模型」。

以物件導向的方式進行設計,只是進攻的前奏,撰寫程式才是最終的目標。

雖然物件導向的理論、方法、技巧經過多年的發展後,業界已經形成基本統一的認知,但並未出現一種統一的「物件導向程式語言」。


一、程式語言的差異性

每種語言都會根據自己的需求、特徵,選擇支援或不支援物件導向,或者只支援部份物件導向的特性。

各種語言對物件導向支援的程度和方式,導致將其設計轉換為程式碼時,還需要做一次翻譯或轉換的過程。

因此,若想充分應用物件導向,除了掌握物件導向的概念、方法、技巧外,還得要精通程式語言與物件導向相關的特性。

本系列以 C/C++ 為主要程式語言,並詳細描述它們與物件導向相關的特性;在 GUI 的設計上,我們會採用 C# 及 Python 來說明。

這邊只是先擷取出 C++ 跟物件導向相關的資料,後續我們會再參考「API Design for C++」一書來了解更多的細節。


二、C++

C++是第一個廣泛流行的物件導向程式語言,至今依然佔據程式語言榜單的前幾名。

儘管 C++ 促進了物件導向程式設計的發展,但它的複雜性也伴隨著較大的爭議;尤其是與物件導向相關的特性,光是各式各樣的術語,就能把剛入門的程式開發者搞得頭昏眼花。

尤其 C++ 相容於 C 語言的特性,導致在程式中,一不留神就會出現「物件導向」和「程序導向」風格混雜的情況。

正因為 C++ 這種特性,當採用 C++ 進行物件導向程式設計時,就需要花費更多的時間和精力,以便瞭解 C++ 物件導向的特型。


三、類別

C++ 類別透過關鍵字 class  來標示。

類別的定義包含兩部分:類別標頭 (header, .h),由 class 和後面的類別名稱組成;類別實作(source, .cpp ),由一對大括弧包圍起來,裡面包含屬性和方法的宣告。

例如:

//NImage.h

#ifndef _NIMAGE_H
#define _NIMAGE_H

#include <windows.h>

#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)

class NImage
{
private:
HBITMAP hBitmap;
LPBYTE lpBits;

int nWidth;
int nHeight;
int nBitCount;
int nBytesPerLine;
int nBytesPerPixel;
int nNumColors;
int nSize;

HDC hMemDC;

public:
NImage();
~NImage();
public:

// Overrides
virtual BOOL BitBlt(HDC,int,int,int,int,int,int,DWORD);
virtual BOOL MaskBlt(HDC,int,int,HBITMAP,DWORD);
virtual HDC GetDC();
virtual void ReleaseDC();

void Create(int Width,int Height,int Bits,DWORD dwFlags=0);
BOOL IsNull();
void Destroy();

int GetWidth();
int GetHeight();
int GetBPP();
int GetPitch();
int GetMaxColorTableEntries();

BYTE* GetPixelAddress(int x,int y);
COLORREF GetPixel(int x,int y );
void GetColorTable(int m, int n, RGBQUAD* ColorTab);
void SetColorTable(int m, int n, RGBQUAD* ColorTab);

BOOL LoadBMP(char* filename);
BOOL SaveBMP(char* filename);

HBITMAP* GetBitmap();

};

#endif //!_NIMAGE_H

在 C++ 中,宣告和定義是分開的,上述程式碼只是 NImage 類別的宣告,其方法需要在定義檔(source, .cpp)實作。

例如:

//NImage.cpp

#include <stdio.h>
#include "NImage.h"

NImage::NImage()
{
hBitmap=NULL;
hMemDC=NULL;
}

NImage::~NImage()
{
Destroy();
}

BOOL NImage::IsNull()
{
if (hBitmap==NULL)
return(TRUE);
else
return(FALSE);
}

void NImage::Destroy()
{
if (hBitmap!=NULL)
{
DeleteObject(hBitmap);
hBitmap=NULL;
}
}


四、存取控制

C++類別的屬性和方法,都可以指定三種存取控制方式:

  1. public: 程式的任何地方都可以存取,例如類別本身、其他類別、其他函式等。
  2. protected: 對子類別就像 public 一樣,對其他程式則表現得像 private。
  3. private: 只能被該類別的成員函式和朋友類別(friend class)存取。

C++ 是分段的存取控制方式,每段的開始透過存取限定詞加上一個冒號 ( : ),直到另一個分段開始時結束,或者到類別定義結束。

一個類別允許包含多個存取控制段;如果沒有指定存取限定詞,則預設為 private。

留言
avatar-img
留言分享你的想法!
avatar-img
一個工程師的創業之旅的沙龍
73會員
442內容數
閱讀可以用最低的成本來獲得別人經驗,培養閱讀能力,一生受益。但要記住,別只讓自己的大腦永遠處於「輸入狀態」,要適當地「輸出」自己的想法。透過閱讀輸入,再利用寫作輸出,就像「費曼學習法」說的一樣,教授到別人能夠了解,自己才算是領悟了這門學問。
2024/02/21
現代的計算機概論範圍也越來越廣了,從傳統的「硬體」、「軟體」到「通訊」及「資料」等;其中,通訊現在應該算獨立於計算機之外自成一派。而資料科學則在近十年「機習學習」或「深度學習」變成顯學後,受到高度重視。不想變成時代的眼淚,還請多努力,別輕易躺平。
Thumbnail
2024/02/21
現代的計算機概論範圍也越來越廣了,從傳統的「硬體」、「軟體」到「通訊」及「資料」等;其中,通訊現在應該算獨立於計算機之外自成一派。而資料科學則在近十年「機習學習」或「深度學習」變成顯學後,受到高度重視。不想變成時代的眼淚,還請多努力,別輕易躺平。
Thumbnail
2023/11/29
從電腦程式語言的歷史來看,進入門檻越低且容易取得相關資源的程式語言會被廣泛使用。現代的軟體開發更重視軟體元件(函式庫)的整合使用與架構,更勝於程式語言本身的特性。現代程式語言的開發已經轉向重視易用性、安全性及函式庫支援的豐富程度,而非單純講求執行階段的效能。
Thumbnail
2023/11/29
從電腦程式語言的歷史來看,進入門檻越低且容易取得相關資源的程式語言會被廣泛使用。現代的軟體開發更重視軟體元件(函式庫)的整合使用與架構,更勝於程式語言本身的特性。現代程式語言的開發已經轉向重視易用性、安全性及函式庫支援的豐富程度,而非單純講求執行階段的效能。
Thumbnail
2023/10/27
作者講的「快速學習法」,其本質上應該就是我先前做過重點摘要的「費曼學習法」,想要教授一樣技能或技術給他人時,自己就要徹底理解問題或技術的本質,然後收集相關的資料,用自己的話重新詮釋問題及解決方式。在這個過程中,就能把知識轉化為自身的理解,從而跟自己的知識樹相連接,存在腦海深處變成本能。
Thumbnail
2023/10/27
作者講的「快速學習法」,其本質上應該就是我先前做過重點摘要的「費曼學習法」,想要教授一樣技能或技術給他人時,自己就要徹底理解問題或技術的本質,然後收集相關的資料,用自己的話重新詮釋問題及解決方式。在這個過程中,就能把知識轉化為自身的理解,從而跟自己的知識樹相連接,存在腦海深處變成本能。
Thumbnail
看更多
你可能也想看
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
創作者營運專員/經理(Operations Specialist/Manager)將負責對平台成長及收入至關重要的 Partnership 夥伴創作者開發及營運。你將發揮對知識與內容變現、影響力變現的精準判斷力,找到你心中的潛力新星或有聲量的中大型創作者加入 vocus。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本章節的目的是讓讀者瞭解C#的物件導向特性,包括類別、繼承、多型、封裝等基本概念,以及介面、抽象類別、靜態類別等進階主題。此外,本章節也將介紹如何使用列舉、委派、Lambda表達式、泛型及反射,這些都是C#中常見的強大功能。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本文介紹了Python中的物件導向程式設計的重要概念,包括類別、繼承、多型、封裝、介面、抽象類別、靜態類別、列舉、委派、Lambda表達式、泛型和反射。每個概念都有對應的程式碼範例來說明其用法和功能。這些概念對於理解和使用Python進行物件導向程式設計至關重要。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
本階段深掘PHP中類別與物件的應用,從基本定義到屬性與方法的運用,並特別著重於訪問控制和靜態成員的概念。學生將學會如何有效地利用公開、保護、私有屬性,以及如何在不實例化的情況下透過類別名稱直接訪問靜態屬性和方法,進一步鞏固物件導向程式設計的核心知識。
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
介紹C++ 語法 資料型態,架構說明 程式語言為人類與電腦溝通的工具 程式設計流程: 定義問題 -> 問題分析 -> 撰寫演算法 ->程式撰寫 -> 程式執行及維護
Thumbnail
這邊要來跟大家介紹C#,使用的軟體會是Visual Studio 2017版本 介紹內容架構可以分六大階段:入門級、基礎級、中低階級、中階級、中高階級、高階級 在正式開始寫程式前,要先了解一些基本概念哦! 就如同學中文前要先了解ㄅㄆㄇㄈ或羅馬拼音之類的,程式也是一樣道理,先把基本概念了解後再來開始
Thumbnail
這邊要來跟大家介紹C#,使用的軟體會是Visual Studio 2017版本 介紹內容架構可以分六大階段:入門級、基礎級、中低階級、中階級、中高階級、高階級 在正式開始寫程式前,要先了解一些基本概念哦! 就如同學中文前要先了解ㄅㄆㄇㄈ或羅馬拼音之類的,程式也是一樣道理,先把基本概念了解後再來開始
Thumbnail
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
Thumbnail
介紹 在過去的歷史裡開發程式都是以呼叫Function的方式來做程式開發,後來才有了物件導向設計的概念,而物件導向程式設計的概念就是,使用【物件】的方式來設計程式。 Q: 什麼是【物件】? A:【物件】會包含以下這四個特性: 抽象(Abstraction) 封裝(Encapsulation)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News