首页 >后端开发 >C++ >C 中的面向对象编程?从头开始实现接口

C 中的面向对象编程?从头开始实现接口

DDD
DDD原创
2025-01-21 10:07:08874浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn