探索计算的复杂性通常不仅需要理解如何某些东西是如何工作的,还需要为什么以及如何从头开始构建它。本文以 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中文网其他相关文章!