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 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>
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>
Fungsi pembantu mencetak harga:
<code class="language-java">public static void printVehiclePrice(Vehicle vehicle) { System.out.println("$" + vehicle.price() + ".00"); }</code>
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>
Meniru ini dalam C memerlukan pendekatan yang berbeza.
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>
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>
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>
Fungsi cetakan harga:
<code class="language-c">void print_vehicle_price(Vehicle *vehicle) { printf("$%d.00\n", vehicle_price(vehicle)); }</code>
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>
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>
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.
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!