基於C語言的面向對象設計模式(持續更新)

来源:https://www.cnblogs.com/pie-o/p/18125356
-Advertisement-
Play Games

前言 首先這篇文章只是初步的嘗試,不涉及過於高深的編程技巧;同時需要表明的是,面向對象只是一種思想,不局限於什麼樣的編程語言,不可否認的是基於面向對象特性而設計的語言確實要比面向過程式的語言更加容易進行抽象和統籌,可以說面向對象的設計模式可以很大程度上擺脫過程的實例,但要論完整的應用來講,設計模式也 ...


前言

首先這篇文章只是初步的嘗試,不涉及過於高深的編程技巧;同時需要表明的是,面向對象只是一種思想,不局限於什麼樣的編程語言,不可否認的是基於面向對象特性而設計的語言確實要比面向過程式的語言更加容易進行抽象和統籌,可以說面向對象的設計模式可以很大程度上擺脫過程的實例,但要論完整的應用來講,設計模式也還是跳不出最終被過程挑選的命運,對象只是對象,過程才是對象真正的實踐戰場

對象設計

對象即模塊,模塊即文件

在C語言環境中,不要想著能實現C++這種真正面向對象特性加持的效果,我們只能實現閹割版的效果,主要還是面向對象思想的運用。

對象基本結構

對象的基本結構就是抽象出對對象最本質的認識,即類型定義;一個類可以有多個對象,而對象與對象之間不僅是邏輯分離的,也是物理分離的,雖然可以用相同的方法和屬性。但在C語言中要想實現多例,就必須傳入該對象的引用,當然可以實現更簡單的多例模式,目前我知道的只有單線程的情況下才能保證安全,可以參考c語言實現this指針效果里的多例實現方式,保守點,還是更推薦傳入引用的方式。

/* 前向聲明 */
struct _AnyObject;
/* 對象基本結構定義 */
typedef struct{
	/* 可直接訪問屬性 */
	anytype Attr1;
	anytype Attr2;
	/* 可間接訪問屬性 */
	struct{
		anytype _Attr3;
		/* 通過指針可實現訪問私有屬性 */
		anytype *_Attr4;
	}PrivatedAttr;
	/* 初始化方法 */
	anytype (*Init)(struct _AnyObject *,anytype,...);
	/* 介面方法 */
	anytype (*Func1)(struct _AnyObject *,anytype,...);
	anytype (*Func2)(struct _AnyObject *,anytype,...);
}AnyObject;

一般情況下,對象都具有屬性方法,並且還有訪問許可權的限制,但C語言存在的訪問許可權方式似乎無法對結構體成員單獨進行控制,const似乎也無法實現。所以私有屬性和方法只能以文件級的static來進行訪問限制了,而對象結構體裡面使用一個嵌套結構體作為另一種表徵對象私有屬性的方式,寄希望於人的自覺;同時如果需要的話,這樣也提供了一種外部訪問真正static私有屬性的一種方式,無非就是指針的使用。

初始化方法與介面定義

主要用於初始化對象的屬性和介面方法的分配,可以為每個對象定義各自的初始化方法和介面方法,當然也可以用同一種方法,但要保證方法的可重入性

/* 初始化方法 */
anytype Obj1_Init(AnyObject *obj,anytype arg,...){
	/* 屬性初始化 */
	obj->Attr1 = arg;
	/* 介面方法分配定義 */
	obj->Func1 = &Obj1_Func1;
}
/* 介面方法定義 */
anytype Obj1_Func1(AnyObject *obj,anytype arg,...){
	/* 操作對象屬性 */
}

實例化對象

/* 實例即定義,必須為每個對象分配好初始化函數 */
AnyObject obj1 = {.Init = Obj1_Init};
AnyObject obj2 = {.Init = Obj2_Init};
/* obj1_init可以和obj2_init一樣 */
/* 需要手動進行初始化 */
obj1.Init(anytype,...);
obj2.Init(anytype,...);

this指針

c語言實現this指針效果

這種方式對於單例很方便,簡化方法調用方式,不用每次都傳入引用,但對於多例就要考慮線程安全問題了。

鏈式調用

主要通過返回對象自身的引用來實現。

AnyObject *ChainFunc(AnyObject *,anytype,...);

結語

後面再學到什麼新的實現會持續更新在這篇文章里,同時也接受批評和改正。

本文來自博客園,作者:pie_thn,轉載請註明原文鏈接:https://www.cnblogs.com/pie-o/p/18125356


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、Popup Popup組件通常用於在屏幕上彈出一個對話框或者浮動視窗。這個組件通常和其他組件一起用於用戶界面的交互和反饋。 Popup組件可以包含任何類型的組件或內容,比如文本、按鈕、輸入框、圖片等等。在打開和關閉Popup時,可以在代碼中設置不同的動畫效果來增強用戶體驗。 Popup組件的 ...
  • 一、Video 視頻組件是用於應用程式中嵌入視頻的一種方法。它可以讓用戶在網站上觀看視頻並與其進行交互。通常,視頻組件將一個視頻文件嵌入應用程式中,並提供一組控制項,這些控制項允許用戶播放、暫停、跳過、音量調整和全屏等。通過使用視頻組件,開發者可以更容易地將視頻嵌入應用程式,使其更易於管理和控制。 ...
  • 在我之前的文章中講了vue文件是如何編譯成js文件,今天這篇文章接著來講講vue3中是如何將template模塊編譯為render函數的。 ...
  • 本文分享自華為雲社區《3月閱讀周·你不知道的JavaScript | ES6生成器,看似同步的非同步流程式控制製表達風格》,作者: 葉一一。 生成器 打破完整運行 JavaScript開發者在代碼中幾乎普遍依賴的一個假定:一個函數一旦開始執行,就會運行到結束,期間不會有其他代碼能夠打斷它並插入其間。 ES ...
  • XSL(eXtensible Stylesheet Language)是一種用於 XML 的樣式語言。 XSL(T) 語言 XSLT 是一種用於轉換 XML 文檔的語言。 XPath 是一種用於在 XML 文檔中導航的語言。 XQuery 是一種用於查詢 XML 文檔的語言。 它始於 XSL XSL ...
  • 一、前言 演算法(Algorithm)是指用來操作數據、解決程式問題的一組方法。對於同一個問題,使用不同的演算法,也許最終得到的結果是一樣的,但在過程中消耗的資源和時間卻會有很大的區別 衡量不同演算法之間的優劣主要是通過時間和空間兩個維度去考量: 時間維度:是指執行當前演算法所消耗的時間,我們通常用「時間復 ...
  • vue3 快速入門系列 - vue3 路由 在vue3 基礎上加入路由。 vue3 需要使用 vue-router V4,相對於 v3,大部分的 Vue Router API 都沒有變化。 Tip:不瞭解路由的同學可以看一下筆者之前的文章:vue2 路由 參考:vue2 路由官網、vue3 路由官網 ...
  • 引言:隨著深度學習技術的發展進步,已經不再依賴強大的GPU算力,便可實現AI推理了,讓AI技術滲透到了電腦、手機、智能設備等各類設備。體育、健身行業也不例外,阿裡體育等IT大廠,推出的樂動力、天天跳繩、百分運動等AI運動APP,讓雲上運動會、線上運動會、健身打卡、AI體育指導、AI體測等概念空前火熱 ...
一周排行
    -Advertisement-
    Play Games
  • GoF之工廠模式 @目錄GoF之工廠模式每博一文案1. 簡單說明“23種設計模式”1.2 介紹工廠模式的三種形態1.3 簡單工廠模式(靜態工廠模式)1.3.1 簡單工廠模式的優缺點:1.4 工廠方法模式1.4.1 工廠方法模式的優缺點:1.5 抽象工廠模式1.6 抽象工廠模式的優缺點:2. 總結:3 ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 本章將和大家分享ES的數據同步方案和ES集群相關知識。廢話不多說,下麵我們直接進入主題。 一、ES數據同步 1、數據同步問題 Elasticsearch中的酒店數據來自於mysql資料庫,因此mysql數據發生改變時,Elasticsearch也必須跟著改變,這個就是Elasticsearch與my ...
  • 引言 在我們之前的文章中介紹過使用Bogus生成模擬測試數據,今天來講解一下功能更加強大自動生成測試數據的工具的庫"AutoFixture"。 什麼是AutoFixture? AutoFixture 是一個針對 .NET 的開源庫,旨在最大程度地減少單元測試中的“安排(Arrange)”階段,以提高 ...
  • 經過前面幾個部分學習,相信學過的同學已經能夠掌握 .NET Emit 這種中間語言,並能使得它來編寫一些應用,以提高程式的性能。隨著 IL 指令篇的結束,本系列也已經接近尾聲,在這接近結束的最後,會提供幾個可供直接使用的示例,以供大伙分析或使用在項目中。 ...
  • 當從不同來源導入Excel數據時,可能存在重覆的記錄。為了確保數據的準確性,通常需要刪除這些重覆的行。手動查找並刪除可能會非常耗費時間,而通過編程腳本則可以實現在短時間內處理大量數據。本文將提供一個使用C# 快速查找並刪除Excel重覆項的免費解決方案。 以下是實現步驟: 1. 首先安裝免費.NET ...
  • C++ 異常處理 C++ 異常處理機制允許程式在運行時處理錯誤或意外情況。它提供了捕獲和處理錯誤的一種結構化方式,使程式更加健壯和可靠。 異常處理的基本概念: 異常: 程式在運行時發生的錯誤或意外情況。 拋出異常: 使用 throw 關鍵字將異常傳遞給調用堆棧。 捕獲異常: 使用 try-catch ...
  • 優秀且經驗豐富的Java開發人員的特征之一是對API的廣泛瞭解,包括JDK和第三方庫。 我花了很多時間來學習API,尤其是在閱讀了Effective Java 3rd Edition之後 ,Joshua Bloch建議在Java 3rd Edition中使用現有的API進行開發,而不是為常見的東西編 ...
  • 框架 · 使用laravel框架,原因:tp的框架路由和orm沒有laravel好用 · 使用強制路由,方便介面多時,分多版本,分文件夾等操作 介面 · 介面開發註意欄位類型,欄位是int,查詢成功失敗都要返回int(對接java等強類型語言方便) · 查詢介面用GET、其他用POST 代碼 · 所 ...
  • 正文 下午找企業的人去鎮上做貸後。 車上聽同事跟那個司機對罵,火星子都快出來了。司機跟那同事更熟一些,連我在內一共就三個人,同事那一手指桑罵槐給我都聽愣了。司機也是老社會人了,馬上聽出來了,為那個無辜的企業經辦人辯護,實際上是為自己辯護。 “這個事情你不能怪企業。”“但他們總不能讓銀行的人全權負責, ...