首頁 > 後端開發 > C++ > C 中的物件導向程式設計?從頭開始實作介面

C 中的物件導向程式設計?從頭開始實作介面

DDD
發布: 2025-01-21 10:07:08
原創
874 人瀏覽過

Object-Oriented Programming in C? Implementing an Interface from Scratch

探索計算的複雜性通常不僅需要理解如何某些東西是如何工作的,還需要為什麼以及如何從頭開始構建它。本文以 Java 作為參考點,深入探討了物件導向程式設計 (OOP) 中的介面概念,然後示範了基本的 C 實作。

簡單的車輛定價範例

我們的範例重點計算車輛價格:汽車以速度定價,摩托車以引擎排氣量 (cc) 定價。 我們從定義核心車輛行為的 Java 介面開始:

<code class="language-java">public interface Vehicle {
    Integer price();
}</code>
登入後複製

此介面由 CarMotorcycle 類別實作:

<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 實作介面:手動方法

在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_priceswitch 來處理不同的車輛類型:

<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)可能受益於類似的結構。 AST 中不同的節點類型可以表示為單獨的結構,所有結構都符合由一組函數定義的通用「介面」。

結論

雖然 C 缺乏內建接口,但透過仔細的結構和函數設計來模擬它們,為實現類似的 OOP 原理提供了強大的機制。 這種手動方法提供了靈活性和控制力,特別有利於解析器和解釋器等複雜項目。

以上是C 中的物件導向程式設計?從頭開始實作介面的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板