探索計算的複雜性通常不僅需要理解如何某些東西是如何工作的,還需要為什麼以及如何從頭開始構建它。本文以 Java 作為參考點,深入探討了物件導向程式設計 (OOP) 中的介面概念,然後示範了基本的 C 實作。
我們的範例重點計算車輛價格:汽車以速度定價,摩托車以引擎排氣量 (cc) 定價。 我們從定義核心車輛行為的 Java 介面開始:
<code class="language-java">public interface Vehicle { Integer price(); }</code>
此介面由 Car
和 Motorcycle
類別實作:
<code class="language-java">public class Car implements Vehicle { private final Integer speed; public Car(Integer speed) { this.speed = speed; } @Override public Integer price() { return speed * 60; } } public class Motorcycle implements Vehicle { private final Integer cc; public Motorcycle(Integer cc) { this.cc = cc; } @Override public Integer price() { return cc * 10; } }</code>
輔助函數列印價格:
<code class="language-java">public static void printVehiclePrice(Vehicle vehicle) { System.out.println("$" + vehicle.price() + ".00"); }</code>
主要方法示範用法:
<code class="language-java">public static void main(String[] args) { Car car = new Car(120); Motorcycle motorcycle = new Motorcycle(1000); printVehiclePrice(car); // Output: 00.00 printVehiclePrice(motorcycle); // Output: 000.00 }</code>
在 C 複製這個需要不同的方法。
在C中,我們缺乏Java的內建介面機制。 我們將使用資料結構和方法函數來模擬它。 編譯器不處理介面解析;我們必須手動完成。
我們的「介面」骨架:
<code class="language-c">#include <stdio.h> #include <stdlib.h> typedef enum { VEHICLE_CAR, VEHICLE_MOTORCYCLE } VehicleType; typedef struct { VehicleType type; } Vehicle; void vehicle_free(Vehicle *vehicle); int vehicle_price(Vehicle *vehicle);</code>
Car
實作:
<code class="language-c">typedef struct { VehicleType type; int speed; } Car; Car *car_init(int speed) { Car *car = malloc(sizeof(Car)); car->type = VEHICLE_CAR; car->speed = speed; return car; } void car_free(Car *car) { free(car); } int car_price(Car *car) { return car->speed * 60; }</code>
Motorcycle
實作(類似 Car
):
<code class="language-c">typedef struct { VehicleType type; int cc; } Motorcycle; Motorcycle *motorcycle_init(int cc) { Motorcycle *motorcycle = malloc(sizeof(Motorcycle)); motorcycle->type = VEHICLE_MOTORCYCLE; motorcycle->cc = cc; return motorcycle; } void motorcycle_free(Motorcycle *motorcycle) { free(motorcycle); } int motorcycle_price(Motorcycle *motorcycle) { return motorcycle->cc * 10; }</code>
價格列印功能:
<code class="language-c">void print_vehicle_price(Vehicle *vehicle) { printf("$%d.00\n", vehicle_price(vehicle)); }</code>
至關重要的是,我們使用 vehicle_free
語句實現 vehicle_price
和 switch
來處理不同的車輛類型:
<code class="language-c">void vehicle_free(Vehicle *vehicle) { switch (vehicle->type) { case VEHICLE_CAR: car_free((Car *)vehicle); break; case VEHICLE_MOTORCYCLE: motorcycle_free((Motorcycle *)vehicle); break; } } int vehicle_price(Vehicle *vehicle) { switch (vehicle->type) { case VEHICLE_CAR: return car_price((Car *)vehicle); case VEHICLE_MOTORCYCLE: return motorcycle_price((Motorcycle *)vehicle); } }</code>
main函數示範用法:
<code class="language-c">int main(void) { Car *car = car_init(120); Motorcycle *motorcycle = motorcycle_init(1000); print_vehicle_price((Vehicle *)car); // Output: 00.00 print_vehicle_price((Vehicle *)motorcycle); // Output: 000.00 vehicle_free((Vehicle *)car); vehicle_free((Vehicle *)motorcycle); return 0; }</code>
這種手動介面方法在解析等場景中特別有用,其中抽象語法樹(AST)可能受益於類似的結構。 AST 中不同的節點類型可以表示為單獨的結構,所有結構都符合由一組函數定義的通用「介面」。
雖然 C 缺乏內建接口,但透過仔細的結構和函數設計來模擬它們,為實現類似的 OOP 原理提供了強大的機制。 這種手動方法提供了靈活性和控制力,特別有利於解析器和解釋器等複雜項目。
以上是C 中的物件導向程式設計?從頭開始實作介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!