Rumah > pembangunan bahagian belakang > C++ > Pengaturcaraan Berorientasikan Objek dalam C? Melaksanakan Antara Muka dari Scratch

Pengaturcaraan Berorientasikan Objek dalam C? Melaksanakan Antara Muka dari Scratch

DDD
Lepaskan: 2025-01-21 10:07:08
asal
870 orang telah melayarinya

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

Meneroka selok-belok pengkomputeran selalunya melibatkan pemahaman bukan sahaja bagaimana sesuatu berfungsi, tetapi juga mengapa dan bagaimana ia boleh dibina dari awal. Artikel ini menyelidiki konsep antara muka dalam pengaturcaraan berorientasikan objek (OOP), menggunakan Java sebagai titik rujukan, dan kemudian menunjukkan pelaksanaan C asas.

Contoh Harga Kenderaan Mudah

Contoh kami memberi tumpuan kepada pengiraan harga kenderaan: harga kereta mengikut kelajuan, motosikal mengikut anjakan enjin (cc). Kita mulakan dengan antara muka Java yang mentakrifkan gelagat kenderaan teras:

<code class="language-java">public interface Vehicle {
    Integer price();
}</code>
Salin selepas log masuk

Antara muka ini kemudiannya dilaksanakan oleh kelas Car dan 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>
Salin selepas log masuk

Fungsi pembantu mencetak harga:

<code class="language-java">public static void printVehiclePrice(Vehicle vehicle) {
    System.out.println("$" + vehicle.price() + ".00");
}</code>
Salin selepas log masuk

Kaedah utama menunjukkan penggunaan:

<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>
Salin selepas log masuk

Meniru ini dalam C memerlukan pendekatan yang berbeza.

Melaksanakan Antara Muka dalam C: Pendekatan Manual

Dalam C, kami kekurangan mekanisme antara muka terbina dalam Java. Kami akan mensimulasikannya menggunakan struct untuk data dan fungsi untuk kaedah. Pengkompil tidak mengendalikan resolusi antara muka; kita mesti melakukannya secara manual.

Rangka "antara muka" kami:

<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>
Salin selepas log masuk

Pelaksanaan 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>
Salin selepas log masuk

Pelaksanaan Motorcycle (serupa dengan 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>
Salin selepas log masuk

Fungsi cetakan harga:

<code class="language-c">void print_vehicle_price(Vehicle *vehicle) {
    printf("$%d.00\n", vehicle_price(vehicle));
}</code>
Salin selepas log masuk

Yang penting, kami melaksanakan vehicle_free dan vehicle_price menggunakan pernyataan switch untuk mengendalikan jenis kenderaan yang berbeza:

<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>
Salin selepas log masuk

Fungsi utama menunjukkan penggunaan:

<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>
Salin selepas log masuk

Aplikasi Praktikal: Pokok Sintaks Abstrak (AST)

Pendekatan antara muka manual ini amat berguna dalam senario seperti penghuraian, di mana Pokok Sintaks Abstrak (AST) mungkin mendapat manfaat daripada struktur yang serupa. Jenis nod yang berbeza dalam AST boleh diwakili sebagai struktur berasingan, semuanya mematuhi "antara muka" biasa yang ditakrifkan oleh satu set fungsi.

Kesimpulan

Walaupun C tidak mempunyai antara muka terbina dalam, mensimulasikannya dengan reka bentuk struktur dan fungsi yang teliti menyediakan mekanisme yang berkuasa untuk mencapai prinsip OOP yang serupa. Pendekatan manual ini menawarkan fleksibiliti dan kawalan, terutamanya bermanfaat dalam projek kompleks seperti penghurai dan jurubahasa.

Atas ialah kandungan terperinci Pengaturcaraan Berorientasikan Objek dalam C? Melaksanakan Antara Muka dari Scratch. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan